Java jdk8 中的stream 用法
程序员文章站
2022-06-04 19:54:13
...
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
Stream(流)是一个来自数据源的元素队列并支持聚合操作
- 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
和以前的Collection操作不同, Stream操作还有两个基础的特征:
- Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
- 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
实际运用如下
package com.example.demo.util.shiyan;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.pojo.ResponseObject;
import com.example.demo.util.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.util.stream.Collectors;
public class Test {
public static void main(String args[]){
streamLianxi();
test1();
}
public static void streamLianxi(){
List<Student> list = new ArrayList<>();
Student student1 = new Student();student1.setAge("12");student1.setSex(0);student1.setName("拉拉");
Student student2 = new Student();student2.setAge("13");student2.setSex(2);student2.setName("嘿嘿");
Student student3 = new Student();student3.setAge("11");student3.setSex(1);student3.setName("秀秀");
Student student4 = new Student();student4.setAge("18");student4.setSex(1);student4.setName("天天");
Student student5 = new Student();student5.setAge("18");student5.setSex(0);student5.setName("小白");
Student student6 = new Student();student6.setAge("18");student6.setSex(2);student6.setName("小美");
Student student7 = new Student();student7.setAge("18");student7.setSex(2);student7.setName("小明");
Student student8 = new Student();student8.setAge("12");student8.setSex(1);student8.setName("小丁");
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student4);
list.add(student5);
list.add(student6);
list.add(student7);
list.add(student8);
list.forEach(System.out::println);
//过滤年龄大于13的学生
List<Student> list2=list.stream().filter(student -> new Integer(student.getAge())>13).collect(Collectors.toList());
list2.forEach(student->{
System.out.println(student.getAge());
});
System.out.println("-----------------------------------");
//打印性别为0的人
List<Student> list3=list.stream().filter(student -> Integer.valueOf(student.getSex())==0).collect(Collectors.toList());
list3.forEach(student->{
System.out.println(student.getAge());
});
System.out.println("-----------------------------------");
//多条件排序
List<Student> list4=list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
list4.forEach(student->{
System.out.println(student.getAge());
});
System.out.println("-----------------------------------");
//多条件倒叙排序
List<Student> list5=list.stream().sorted(Comparator.comparing(Student::getAge).reversed().thenComparing(Student::getSex)).collect(Collectors.toList());
list5.forEach(student->{
System.out.println(student.getAge()+" "+student.getSex());
});
System.out.println("-----------------------------------");
Map<String, List<Student>> groupBy = list.stream().collect(Collectors.groupingBy(Student::getAge));
System.out.println(groupBy);
Set<String> idSet=groupBy.keySet();
for (String id:idSet) {
System.out.println(id+groupBy.get(id));
}
System.out.println("获取key的值"+groupBy.keySet());
System.out.println(" "+groupBy.get("11").get(0).getName());
}
static void test1(){
List<Double> cost = Arrays.asList(10.0, 30.0,20.0);
System.out.println("=============foreach循环=============");
cost.stream().forEach(x->{
if(x==10.0){
x=1.0;
}
});
cost.stream().forEach(System.out::println);
System.out.println("=============map成为新的对象=============");
cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
System.out.println("=============reduce计算总和=============");
double arraysSum=cost.stream().map(x -> x*10).reduce((sum,x)->sum+x).get();
System.out.println("arraysSum"+arraysSum);
System.out.println("=============filter筛选=============");
List<Double> list=cost.stream().filter(x->x>10).collect(Collectors.toList());
list.stream().forEach(System.out::println);
}
}
运行结果
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
18
18
18
18
-----------------------------------
12
18
-----------------------------------
11
12
12
13
18
18
18
18
-----------------------------------
18 0
18 1
18 2
18 2
13 2
12 0
12 1
11 1
-----------------------------------
{11=[[email protected]], 12=[[email protected], [email protected]], 13=[[email protected]], 18=[[email protected], [email protected], [email protected], [email protected]]}
11[[email protected]]
12[[email protected], [email protected]]
13[[email protected]]
18[[email protected], [email protected], [email protected], [email protected]]
获取key的值[11, 12, 13, 18]
秀秀
=============foreach循环=============
10.0
30.0
20.0
=============map成为新的对象=============
10.5
31.5
21.0
=============reduce计算总和=============
arraysSum600.0
=============filter筛选=============
30.0
20.0
上一篇: 如何使用手机浏览器访问wamp
下一篇: PHP基础知识回顾_PHP