Java8之Stream流代替For循环操作

Stream流代替For循环进行输出可以使代码更简洁。

需求:根据姓名获取员工信息

1.建立实体类:Emp

public class Emp {
 private String id;
 private String name;

 public Emp(String id, String name) {
 this.id=id;
 this.name=name;
 }
 public String getId() {
 return id;
 }
 public void setId(String id) {
 this.id = id;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 @Override
 public String toString() {
 return "Emp信息: [id=" + id + ", name=" + name + "]";
 }

2.测试类:

(1.) 原始For写法:

List<Emp> emps = new ArrayList<>();
 emps.add(new Emp("00101","张三"));
 emps.add(new Emp("00102","张四"));
 emps.add(new Emp("00103","张五"));
 emps.add(new Emp("00104","张六"));
 emps.add(new Emp("00105","张七"));

 for (Emp emp : emps) {
 if (emp.getName().equals("张三")) {
 System.out.println(emp);
 return;
 }
 }

(2.) Stream流:

List<Emp> emps = new ArrayList<>();
 emps.add(new Emp("00101","张三"));
 emps.add(new Emp("00102","张四"));
 emps.add(new Emp("00103","张五"));
 emps.add(new Emp("00104","张六"));
 emps.add(new Emp("00105","张七"));

 //filter()定义方法,toList()输出为list
 List<Emp> emp=emps.stream().filter(e -> "张三".equals(e.getName())).collect(Collectors.toList());
 emp.forEach(System.out::println);

输出结果为:

补充知识:java中for、foreach、stream性能比较

我们在开发中循环遍历一个数组经常会用到,jdk8推出了一些新特性,对循环做了比较,通过代码亲测,记录一下!

1、for循环

public static void main(String[] args) {
 Long startTime = System.currentTimeMillis();
 formMethod();
 Long endTime = System.currentTimeMillis();
 System.out.println("result:" + (endTime - startTime));
}

public static void formMethod(){
 for (int i = 0; i < 10000; i++) {
  System.out.println("start::::::::::::");
 }
 }

2、foreach循环(for循环的增强版)

public static void main(String[] args) {
 List<Integer> list = new ArrayList<Integer>();
 for (int i = 0; i < 10000; i++) {
  list.add(i);
 }
 Long startTime = System.currentTimeMillis();
 foreachMethod(list);
 Long endTime = System.currentTimeMillis();
 System.out.println("result:" + (endTime - startTime));
}

/**
* foreach
* @param list
*/
public static void foreachMethod(List<Integer> list){
 list.forEach(i ->{
  System.out.println("++++++++++++");
 });
}

结论:通过代码测试发现在1万以内的数据,for循环比foreach效率要高一些;但是10万以内数据的时候,foreach效率更高一些!

foreach [10万数据时间 1112 1165 1203 1115] [1万数据 235 146 176 164 175]

for循环 [10万数据时间 1330 1437 1347] [1万数据 110 109 141]

3、stream api

(1)、串行处理,即同步处理

public static void main(String[] args) {
 List<Integer> list = new ArrayList<Integer>();
 for (int i = 0; i < 10000; i++) {
  list.add(i);
 }
 Long startTime = System.currentTimeMillis();
 streamMethod(list);
 Long endTime = System.currentTimeMillis();
 System.out.println("result:" + (endTime - startTime));
}

/**
* stream 串行处理
* @param list
*/
public static void streamMethod(List<Integer> list){
 list.stream().forEach(i ->{
  System.out.println("========");
 });
}

结论:1万以内的数据,for循环的性能要高于foreach和stream;10万以内的数据明显可以看出stream效率最高,其次foreach,最后是for。

[10万数据时间 854 892 789 844][1万数据 172 156 219 172 171]

(2)并行处理,即stream api提供了异步处理机制

public static void main(String[] args) {
 List<Integer> list = new ArrayList<Integer>();
 for (int i = 0; i < 10000; i++) {
  list.add(i);
 }
 Long startTime = System.currentTimeMillis();
 parallelStreamMethod(list);
 Long endTime = System.currentTimeMillis();
 System.out.println("result:" + (endTime - startTime));
}
/**
* stream 并行处理
* @param list
*/
public static void parallelStreamMethod(List<Integer> list){
 list.parallelStream().forEach(i ->{
  System.out.println("========");
 });
}

结论:1万以内的数据,for循环的性能要高于foreach和stream;10万以内的数据明显可以看出stream效率最高,其次foreach,最后是for。

[10万数据时间 893 844 914 972][1万数据 219 203 234 188 ]

最终总结:如果数据在1万以内的话,for循环效率高于foreach和stream;如果数据量在10万的时候,stream效率最高,其次是foreach,最后是for。另外需要注意的是如果数据达到100万的话,parallelStream异步并行处理效率最高,高于foreach和for。

以上这篇Java8之Stream流代替For循环操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java8 Stream对两个 List 遍历匹配数据的优化处理操作

    使用场景,有两个List<Map<String,Object>>集合,第一个集合的所有元素都是需要保留的. 第一个集合的值为: {name=张三丰1, id=1} {name=张三丰2, id=2} {name=张三丰3, id=3} {name=张三丰4, id=4} {name=张三丰5, id=5} {name=张三丰6, id=6} {name=张三丰7, id=7} {name=张三丰8, id=8} 第二个集合的值为: {grade=61, id=1} {grade=6

  • Java8 Stream API 详细使用方法与操作技巧指南

    本文实例讲述了Java8 Stream API 详细使用方法与操作技巧.分享给大家供大家参考,具体如下: 1. 概述 Java 8 引入的一个重要的特性无疑是 Stream API.Stream 翻译过来是"流",突然想到的是大数据处理有个流式计算的概念,数据通过管道经过一个个处理器(Handler)进行筛选,聚合,而且流都具有向量性,强调的是对数据的计算处理,而集合强调的是数据集.Stream可以看做是一个可操作的数据集序列,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.

  • java8 Stream流逐行处理文本文件

    本文中为大家介绍使用java8 Stream API逐行读取文件,以及根据某些条件过滤文件内容 1. Java 8逐行读取文件 在此示例中,我将按行读取文件内容并在控制台打印输出. Path filePath = Paths.get("c:/temp", "data.txt"); //try-with-resources语法,不用手动的编码关闭流 try (Stream<String> lines = Files.lines( filePath )) {

  • java8新特性 stream流的方式遍历集合和数组操作

    前言: 在没有接触java8的时候,我们遍历一个集合都是用循环的方式,从第一条数据遍历到最后一条数据,现在思考一个问题,为什么要使用循环,因为要进行遍历,但是遍历不是唯一的方式,遍历是指每一个元素逐一进行处理(目的),而并不是从第一个到最后一个顺次处理的循环,前者是目的,后者是方式. 所以为了让遍历的方式更加优雅,出现了流(stream)! 1.流的目的在于强掉做什么 假设一个案例:将集合A根据条件1过滤为子集B,然后根据条件2过滤为子集C 在没有引入流之前我们的做法可能为: public cl

  • Java8之Stream流代替For循环操作

    Stream流代替For循环进行输出可以使代码更简洁. 需求:根据姓名获取员工信息 1.建立实体类:Emp public class Emp { private String id; private String name; public Emp(String id, String name) { this.id=id; this.name=name; } public String getId() { return id; } public void setId(String id) { th

  • Java8特性之用Stream流代替For循环操作详解

    目录 准备一个实体类 准备一个List集合 传统的for循环 使用Stream流 先声明筛选条件,在遍历 Stream操作 嵌套循环(2层) 准备一个实体类 public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int get

  • Java8中Stream流式操作指南之入门篇

    目录 简介 正文 1. 流是什么 2. 老板,上栗子 3. 流的操作步骤 4. 流的特点 5. 流式操作和集合操作的区别: 总结 简介 流式操作也叫做函数式操作,是Java8新出的功能 流式操作主要用来处理数据(比如集合),就像泛型也大多用在集合中一样(看来集合这个小东西还是很关键的啊,哪哪都有它) 下面我们主要用例子来介绍下,流的基操(建议先看下lambda表达式篇,里面介绍的lambda表达式.函数式接口.方法引用等,下面会用到) 正文 1. 流是什么 流是一种以声明性的方式来处理数据的AP

  • 总结一下关于在Java8中使用stream流踩过的一些坑

    Java8的stream流 第一个坑: Collectors.toAsList()其实是new了一个list,在向里面赋值. 注意这里Collectors.toList()的写法,这里其实是底层new ArraryList().筛选的数据放到一个新的list.虽然标1处和标2处是同一个变量,但是内存地址是不一样啊.下面的逻辑时把hldrPolVOList中的某些元素删除.但是这个方法执行完后其实是没有删除里面元素的.原因就是这里的new ArraryList()更改了内存地址造成的. 测试: 解

  • 使用Java8 Stream流的skip + limit实现批处理的方法

    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (

  • Java8 stream流的map()方法你会使用了吗

    目录 一.前言 二.概述 三.详述 3.1.找出所有的学生姓名 3.2.将姓名为“赵三”的语文成绩置为90 3.3.找出一年级学生的成绩 四.总结 一.前言 在日常的开发工作中经常碰到要处理list中数据的问题,比如从数据库中查出了很多学生,由于一些原因需要在内存中找出这些学生中的所有姓名,或者把名为“王五”的语文成绩暂时修改为“100”,这些问题怎么处理呐,之前我们想到的是遍历每个元素,然后取出来放到另外一个集合中,在java8中对集合可以进行流式操作使上面的处理更简洁.今天来看下map()方

  • 通过实例了解Java 8创建Stream流的5种方法

    这篇文章主要介绍了通过实例了解Java 8创建Stream流的5种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 不知不觉间,Java已经发展到13了,来不及感慨时间过得真的太快了,来不及学习日新月异的技术更新,目前大多数公司还是使用的JDK8版本,一方面是版本的稳定,另一方面是熟悉,所以很多公司都觉得不升级也挺好. 说到JDK8,真的是一个里程碑的版本,一出世就受到所有开发者的青睐,并主动花时间和精力去学习,也是我见过企业升级JDK最豪爽

  • Java8新特性Stream流实例详解

    什么是Stream流? Stream流是数据渠道,用于操作数据源(集合.数组等)所生成的元素序列. Stream的优点:声明性,可复合,可并行.这三个特性使得stream操作更简洁,更灵活,更高效. Stream的操作有两个特点:可以多个操作链接起来运行,内部迭代. Stream可分为并行流与串行流,Stream API 可以声明性地通过 parallel() 与sequential() 在并行流与顺序流之间进行切换.串行流就不必再细说了,并行流主要是为了为了适应目前多核机器的时代,提高系统CP

  • Java8中的Stream流式操作教程之王者归来

    前言 相对于Java8之前的Java的相关操作简直是天差地别,Java8 的流式操作的出现,也很大程度上改变了开发者对于Java的繁琐的操作的印象,从此,Java也走向了函数式编程的道路! 1 流的创建 1.1 流的创建方法 既然需要聊聊流的操作,那么,首先还是先看看怎么创建流. 创建流的方法有三种,分别是:Stream.of().Stream.iterate().Stream.generate(),然后,分别看一下这三个方法的声明. static <T> Stream<T> of

随机推荐