求求你别在用 for循环遍历list 了,真的太low了!

普通for循环Java8中foreach()循环中return,continue,break的用法 目录 1 前言 2 普通for循环中return,continue,break的用法 3 Java8中foreach()的用法 4 如何退出Java8中的foreach()循环 4.1 anyMatch(Predicate p) 1 前言 在我们平时开发中,会发现Java8的foreach()循环使用率要远远大于之前的普通for循环使用,它们二者在使用上还是有许多区别的。之前能跳出普通for循环使用的一些关键字在Java8中的foreach()循环中却不能使用。 2 普通for... 阅读详情

推荐阅读:史上最污技术解读,我竟然秒懂了

简介

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

熟悉Linux的同学对这种风格一定不陌生,因为它跟Linux的|管道符的思想如出一辙。上面这段话引用自runoob.com,但是其教学代码都是基于String列表进行演示,考虑到实际情况百分之80的时候都是对PO、VO进行处理,因此以下通过一个PO进行讲解。

对比起for循环操作list,最大的弊端就是代码太长太乱了,如果涉及3-4张表的操作,也就是涉及多个PO操作,那个括号简直就是俄罗斯套娃,写到最后真的自己都不知道在写什么

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

PO代码

public class UserPo {
    private String name;
    private Double score;
    
    // 省略构造函数及getter、setter
}

以下操作均以UserPo进行讲解

filter

filter:过滤,就是过滤器,符合条件的通过,不符合条件的过滤掉

// 筛选出成绩不为空的学生人数
count = list.stream().filter(p -> null != p.getScore()).count();

map

map:映射,他将原集合映射成为新的集合,在VO、PO处理的过程中较常见。在本例子中,原集合就是PO集合,新集合可以自定义映射为成绩集合,同时也可以对新集合进行相关操作

// 取出所有学生的成绩
List<Double> scoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());

// 将学生姓名集合串成字符串,用逗号分隔
String nameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));

sorted

sorted:排序,可以根据指定的字段进行排序

// 按学生成绩逆序排序 正序则不需要加.reversed()
filterList = list.stream().filter(p -> null != p.getScore()).sorted(Comparator.comparing(UserPo::getScore).reversed()).collect(Collectors.toList());

forEach

forEach:这个应该是最常用的,也就是为每一个元素进行自定义操作

除了forEach操作会改变原集合的数据,其他的操作均不会改变原集合,这点务必引起注意

// 学生成绩太差了,及格率太低,给每个学生加10分,放个水
// forEach
filterList.stream().forEach(p -> p.setScore(p.getScore() + 10));

collect

collect:聚合,可以用于GroudBy按指定字段分类,也可以用于返回列表或者拼凑字符串

// 按成绩进行归集
Map<Double, List<UserPo>> groupByScoreMap = list.stream().filter(p -> null != p.getScore()).collect(Collectors.groupingBy(UserPo::getScore));
for (Map.Entry<Double, List<UserPo>> entry : groupByScoreMap.entrySet()) {
    System.out.println("成绩:" + entry.getKey() + " 人数:" + entry.getValue().size());
}

// 返回list
List<Double> scoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());
// 返回string用逗号分隔
String nameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));

statistics

statistics:统计,可以统计中位数,平均值,最大最小值

DoubleSummaryStatistics statistics = filterList.stream().mapToDouble(p -> p.getScore()).summaryStatistics();
System.out.println("列表中最大的数 : " + statistics.getMax());
System.out.println("列表中最小的数 : " + statistics.getMin());
System.out.println("所有数之和 : " + statistics.getSum());
System.out.println("平均数 : " + statistics.getAverage());

parallelStream

parallelStream:并行流,可以利用多线程进行流的操作,提升效率。但是其不具备线程传播性,因此使用时需要充分评估是否需要用并行流操作

// 并行流
count = list.parallelStream().filter(p -> null != p.getScore()).count();

完整代码

package com.cmx.tcn.stream;

/**
 * @author: Cai MinXing
 **/
public class UserPo {
    private String name;
    private Double score;

    public UserPo(String name, Double score) {
        this.name = name;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "UserPo{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}
package com.cmx.tcn.stream;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.DoubleSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author: Cai MinXing
 * @create: 2020-03-25 18:15
 **/
public class StreamTest {

//    +--------------------+       +------+   +------+   +---+   +-------+
//    | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
//    +--------------------+       +------+   +------+   +---+   +-------+

    public static void main(String args[]){

        List<UserPo> list = new ArrayList<>();
        list.add(new UserPo("小一", 10.d));
        list.add(new UserPo("小五", 50.d));
        list.add(new UserPo("小六", 60.d));
        list.add(new UserPo("小6", 60.d));
        list.add(new UserPo("小空", null));
        list.add(new UserPo("小九", 90.d));

        long count = 0;
        List<UserPo> filterList = null;

        // filter 过滤器的使用
        // 筛选出成绩不为空的学生人数
        count = list.stream().filter(p -> null != p.getScore()).count();
        System.out.println("参加考试的学生人数:" + count);

        // collect
        // 筛选出成绩不为空的学生集合
        filterList = list.stream().filter(p -> null != p.getScore()).collect(Collectors.toList());
        System.out.println("参加考试的学生信息:");
        filterList.stream().forEach(System.out::println);

        // map 将集合映射为另外一个集合
        // 取出所有学生的成绩
        List<Double> scoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());
        System.out.println("所有学生的成绩集合:" + scoreList);

        // 将学生姓名集合串成字符串,用逗号分隔
        String nameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));
        System.out.println("所有学生的姓名字符串:" + nameString);

        // sorted排序
        // 按学生成绩逆序排序 正序则不需要加.reversed()
        filterList = list.stream().filter(p -> null != p.getScore()).sorted(Comparator.comparing(UserPo::getScore).reversed()).collect(Collectors.toList());
        System.out.println("所有学生的成绩集合,逆序排序:");
        filterList.stream().forEach(System.out::println);

        System.out.println("按学生成绩归集:");
        Map<Double, List<UserPo>> groupByScoreMap = list.stream().filter(p -> null != p.getScore())
                .collect(Collectors.groupingBy(UserPo::getScore));
        for (Map.Entry<Double, List<UserPo>> entry : groupByScoreMap.entrySet()) {
            System.out.println("成绩:" + entry.getKey() + " 人数:" + entry.getValue().size());
        }

        // forEach
        filterList.stream().forEach(p -> p.setScore(p.getScore() + 10));
        System.out.println("及格人数太少,给每个人加10分");
        filterList.stream().forEach(System.out::println);

        // count
        count = filterList.stream().filter(p -> p.getScore() >= 60).count();
        System.out.println("最后及格人数" + count);

        DoubleSummaryStatistics statistics = filterList.stream().mapToDouble(p -> p.getScore()).summaryStatistics();
        System.out.println("列表中最大的数 : " + statistics.getMax());
        System.out.println("列表中最小的数 : " + statistics.getMin());
        System.out.println("所有数之和 : " + statistics.getSum());
        System.out.println("平均数 : " + statistics.getAverage());

        // 并行流 使用
        count = list.parallelStream().filter(p -> null != p.getScore()).count();
        System.out.println("并行流处理参加考试的学生人数:" + count);

    }

}

原文:bugpool.blog.csdn.net/article/details/105122681

MicroPython条件与循环实战:嵌入式开发的核心控制流 在嵌入式系统与物联网开发中,控制流是程序逻辑的骨架,决定了设备如何感知、决策与执行。条件判断(if/else)和循环结构(while/for)作为编程基础,是实现设备智能行为的关键。其原理在于通过布尔逻辑和迭代机制,让微控制器能对外部输入做出响应并持续工作。在资源受限的MCU(如ESP32、RP2040)上,高效运用这些结构能显著提升代码可靠性与能效。典型应用场景包括传感器数据阈值判断、状态机实现、轮询输入以及低功耗循环控制。本文聚焦MicroPython环境,深入解析条件与循环在嵌入式项目中的实战技巧、常 阅读详情

相关推荐

Java8中利用stream对map集合进行过滤的方法

Map<String,Object> ddw=new HashMap<>(); ddw.put("height","150"); ddw.put("weight","510"); Map<String,Object> hl=new HashMap<>(); hl.put("height","160"); hl.put(" height","610"); Map<String,Object> gy=n.

阿杰同学的博客 5650

list.stream().forEach

People people1 = new People(1, "Ligs", true); People people2 = new People(2, "Songzx", false); People people3 = new People(3, "Jinzg", true); People people4 = new People(4, "Liuzx", false); People people5 = new Peopl...

IX的博客 9630

Java 8中的增强型循环foreach

增强型循环提供了一种简洁、便捷的方式来遍历数组、集合或其他可迭代对象中的元素。总结一下,在Java 8中,增强型循环foreach)提供了一种简洁、便捷的方式来遍历数组、集合或其他可迭代对象中的元素。然而,需要注意的是增强型循环无法修改可迭代对象中的元素。其中,元素类型是可迭代对象中元素的类型,变量名是代表每个元素的变量名,可迭代对象是需要遍历的数组、集合或其他实现了Iterable接口的对象。需要注意的是,增强型循环遍历过程中无法修改可迭代对象中的元素。除了数组,我们也可以使用增强型循环遍历集合。

BrchCpp的博客 672

list stream().forEach

遍历list的另一种写法 List&lt;Integer&gt; list= new ArrayList&lt;&gt;(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); list.add(6); list.stream().forEach(item -&gt; { Syst...

maqingbin8888的专栏 9万+

Java中使用for而不是forEach遍历List的10大理由

引言我相信作为一名java开发者你一定听过或者看过类似《你还在用for循环遍历List吗?》、《JDK8都10岁了,你还在用for循环遍历List吗?》这类鄙视在Java中使用for循环遍历List的水文。这类文章说的其实就是使用Java8中的Stream.foreach()来遍历元素,在技术圈感觉使用新的技术就高大上,开...

qq_35485206的博客 1042

javafor使用

我相信作为一名java开发者你一定听过或者看过类似《你还在用for循环遍历List吗?》、《JDK8都10岁了,你还在用for循环遍历List吗?》这类鄙视在Java中使用for循环遍历List的水文。这类文章说的其实就是使用Java8中的Stream.foreach()来遍历元素,在技术圈感觉使用新的技术就高大上,开发者们也都默许接受新技术的很多缺点,而使用老的技术或者传统的方法就会被人鄙视,被人觉得Low,那么使用forEach()真的很高大上吗?它真的比传统的for循环好用吗?

384

C++ STL list与迭代器实战:构建高效任务管理系统

在C++标准模板库中,容器与迭代器是核心组件,它们共同构成了泛型编程的基础。list作为双向链表容器,其设计原理基于节点链接,每个元素独立存储并通过指针相连,这使得它在序列中间进行频繁插入和删除操作时具有O(1)的时间复杂度优势。这种特性在需要动态管理数据项的场景中极具技术价值,例如任务队列、实时事件处理或游戏实体管理。相比之下,vector虽然支持随机访问,但在中间位置修改时可能引发大规模数据搬移。通过迭代器这一抽象层,开发者可以统一地遍历和操作容器元素,而无需关心底层数据结构的具体实现。本文将结合任务管

weixin_34032792的博客 423

C++ STL遍历与查找算法实战:从手写循环到声明式编程

在C++编程中,遍历和查找是最高频的操作,直接关系到代码的性能与可维护性。传统的手写循环不仅冗长,还容易引入迭代器越界等错误。C++标准模板库(STL)提供了一套基于迭代器抽象的泛型算法,实现了从过程式到声明式的编程范式转变。通过理解迭代器作为容器与算法的桥梁,开发者可以灵活运用 `std::for_each`、`std::find`、`std::binary_search` 等算法,显著提升代码的清晰度和健壮性。这些算法不仅减少了常见Bug,还能通过C++17的并行执行策略和C++20的范围库进一步优化性

weixin_30565327的博客 344

Pandas DataFrame遍历性能优化:从循环到向量化的实战指南

在数据处理中,遍历操作是访问和转换数据的核心基础。其原理在于数据在内存中的存储结构与访问方式,不同的遍历方法对应不同的抽象层次和性能开销。掌握高效的遍历技术能显著提升数据处理效率,减少计算资源消耗,这是数据工程师和分析师的关键能力。在实际应用场景中,如数据清洗、特征工程和报表生成,优化遍历性能直接影响任务执行速度。本文聚焦DataFrame遍历,深入解析iterrows、itertuples、apply等方法的性能差异与适用场景,并重点探讨向量化操作这一高效技术,通过对比实测数据,揭示性能提升的关键路径,帮

weixin_30412167的博客 412

Python循环结构:从基础语法到高级优化

循环是编程中的基础控制结构,用于重复执行代码块直到满足特定条件。Python提供了for和while两种循环结构,分别适用于已知迭代次数和条件不确定的场景。理解迭代器协议和循环控制语句(break/continue/else)是掌握Python循环的关键。在数据处理、自动化脚本和算法实现等应用场景中,合理使用列表推导式、生成器表达式以及enumerate/zip等内置函数可以显著提升代码效率和可读性。针对性能敏感场景,还可采用并行处理、避免不必要循环等优化技巧。Python循环与函数、装饰器等特性的结合,进

weixin_33788244的博客 404

Delphi的in循环

今天无意中看到了一篇文章里面提起到了for in do 循环,之前没有用过的方法。一、遍历 TStrings var List: TStrings; s: string; begin List := TStringList.Create; List.CommaText := ‘aaa,bbb,ccc’;for s in List do ShowMessage(s

放肆的IT的专栏 1457

C++ std::list 深度解析:双向链表的性能优势与实战应用

在C++标准模板库(STL)中,容器是管理数据集合的核心组件,其选择直接影响程序性能与内存效率。数据结构决定了容器的基本行为,例如数组支持快速随机访问,而链表则在任意位置插入删除上具有优势。双向链表作为一种经典数据结构,通过节点指针链接实现元素逻辑有序但物理非连续存储,其核心原理在于仅通过修改相邻节点指针即可完成结构调整,避免了数据的大规模移动。这一特性赋予了它在高频修改场景下的独特技术价值,尤其适用于需要稳定迭代器引用、频繁进行元素重排或局部拼接的操作。从工程实践角度看,std::list 正是基于双向链

weixin_34319817的博客 288

二叉树层序遍历:从BFS基础到高频变体实战解析

广度优先搜索(BFS)是图与树遍历中的基础算法,其核心思想是逐层探索节点,确保先访问的节点其邻接点也优先被访问。这一特性使其天然适用于需要按层处理或寻找最短路径的场景。在数据结构中,队列凭借其先进先出(FIFO)的特性,成为实现BFS的理想选择。从工程实践角度看,掌握基于队列的BFS模板,不仅能高效解决基础的层序遍历问题,更是应对众多衍生问题的通用钥匙,例如计算层平均值、执行锯齿形遍历或寻找底层最左值。本文以二叉树层序遍历为锚点,深入剖析其队列实现原理、复杂度分析及代码优化技巧,并自然延伸至LeetCode

ithome 471
上一篇: 美媒:马斯克已掌管推特 立即开除CEO、CFO,新CEO据传是曾经卖牛肉的中国人
下一篇: 应届入职华为OD一个半月,治好了我的精神内耗
xhmj12
博客等级 码龄14年 952粉丝 278原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值