Java8 Stream
来源:互联网 发布:羽西的淘宝旗舰店 编辑:程序博客网 时间:2024/04/28 23:50
原文链接:点击打开链接
Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作。
一、流的初始化与转换:
Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到Stream对象:
1、初始化一个流:
Stream stream = Stream.of("a", "b", "c");
2、数组转换为一个流:
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
或者
stream = Arrays.stream(strArray);
3、集合对象转换为一个流(Collections):
List<String> list = Arrays.asList(strArray);
stream = list.stream();
二、流的操作:
流的操作可以归结为几种:
使用map操作可以遍历集合中的每个对象,并对其进行操作,map之后,用.collect(Collectors.toList())会得到操作后的集合。
List<String> output = wordList.stream().
map(String::toUpperCase).
collect(Collectors.toList());
List<Integer> nums = Arrays.asList(1, 2, 3, 4);
List<Integer> squareNums = nums.stream().
map(n -> n * n).
collect(Collectors.toList());
使用filter可以对象Stream中进行过滤,通过测试的元素将会留下来生成一个新的Stream。
List<String> filterLists = new ArrayList<>();
filterLists.add("");
filterLists.add("a");
filterLists.add("b");
List afterFilterLists = filterLists.stream()
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
如果只是想对流中的每个对象进行一些自定义的操作,可以使用forEach:
List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.stream().forEach(s-> System.out.println(s));
limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素:
List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.add("d");
forEachLists.add("e");
forEachLists.add("f");
List<String> limitLists = forEachLists.stream().skip(2).limit(3).collect(Collectors.toList());
注意skip与limit是有顺序关系的,比如使用skip(2)会跳过集合的前两个,返回的为c、d、e、f,然后调用limit(3)会返回前3个,所以最后返回的c,d,e
sort可以对集合中的所有元素进行排序。max,min可以寻找出流中最大或者最小的元素,而distinct可以寻找出不重复的元素:
5.1、对一个集合进行排序:
List<Integer> sortLists = new ArrayList<>();
sortLists.add(1);
sortLists.add(4);
sortLists.add(6);
sortLists.add(3);
sortLists.add(2);
List<Integer> afterSortLists = sortLists.stream().sorted((In1,In2)->
In1-In2).collect(Collectors.toList());
List<String> maxLists = new ArrayList<>();
maxLists.add("a");
maxLists.add("b");
maxLists.add("c");
maxLists.add("d");
maxLists.add("e");
maxLists.add("f");
maxLists.add("hahaha");
int maxLength = maxLists.stream().mapToInt(s->s.length()).max().getAsInt();
System.out.println("字符串长度最长的长度为"+maxLength);
List<String> distinctList = new ArrayList<>();
distinctList.add("a");
distinctList.add("a");
distinctList.add("c");
distinctList.add("d");
List<String> afterDistinctList = distinctList.stream().distinct().collect(Collectors.toList());
其中的distinct()方法能找出stream中元素equal(),即相同的元素,并将相同的去除,上述返回即为a,c,d。
6、匹配(Match方法):
有的时候,我们只需要判断集合中是否全部满足条件,或者判断集合中是否有满足条件的元素,这时候就可以使用match方法:
allMatch:Stream 中全部元素符合传入的 predicate,返回 true
anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true
noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true
6.1、判断集合中没有有为‘c’的元素:
List<String> matchList = new ArrayList<>();
matchList.add("a");
matchList.add("a");
matchList.add("c");
matchList.add("d");
boolean isExits = matchList.stream().anyMatch(s -> s.equals("c"));
6.2、判断集合中是否全不为空:
List<String> matchList = new ArrayList<>();
matchList.add("a");
matchList.add("");
matchList.add("a");
matchList.add("c");
matchList.add("d");
boolean isNotEmpty = matchList.stream().noneMatch(s -> s.isEmpty());
则返回的为false
6.3 多条件判断
除了在语言层面支持函数式编程风格,Java 8也添加了一个包,叫做 java.util.function。它包含了很多类,用来支持Java的函数式编程。其中一个便是Predicate,使用 java.util.function.Predicate 函数式接口以及lambda表达式,可以向API方法添加逻辑,用更少的代码支持更多的动态行为。下面是Java 8 Predicate 的例子,展示了过滤集合数据的多种常用方法。Predicate接口非常适用于做过滤。
List<String> matchList = newArrayList<>();
matchList.add("a");matchList.add("b");matchList.add("e");matchList.add("d");Predicate<String> prea = (str)->!str.equals("e");//不等于ePredicate<String> preb = (str)->!str.equals("b");//不等于bmatchList.stream().filter(prea.and(preb)).forEach(System.out::println);//组合条件
7 流API定义的 reduce() 函数可以接受lambda表达式,并对所有值进行合并
List<String> strList = Arrays.asList("hello","word","jia","zhi");String text =strList.stream().map(str->str.toUpperCase()).reduce((str,col)->col+=str).get();System.out.println(text);返回 ZHIJIAWORDHELLO
8 IntStream、LongStream 和 DoubleStream 等流的类中,有个非常有用的方法叫做 summaryStatistics() 。可以返回 IntSummaryStatistics、LongSummaryStatistics 或者 DoubleSummaryStatistic s,描述流中元素的各种摘要数据。
在本例中,我们用这个方法来计算列表的最大值和最小值。它也有 getSum() 和 getAverage() 方法来获得列表的所有元素的总和及平均值。
List<Integer> intList = Arrays.asList(1,2,3,4,23,0);IntSummaryStatistics stats = intList.stream().mapToInt(x->x).summaryStatistics();System.out.println(stats.getMax());System.out.println(stats.getMin());System.out.println(stats.getAverage());
- Java8 Stream
- java8 stream
- Java8 Stream
- Java8 Stream
- Java8:Stream
- java8-stream
- java8 stream
- Java8 Stream
- Java8 Stream
- Java8 stream
- java8 stream
- java8-stream
- Java8 Stream
- Java8 Stream操作
- Java8 stream语法
- Java8新特性 Stream
- Java8 Stream初体验
- Java8 Stream 教程
- 急!在线等!遥控钥匙没电了怎么办?
- unity 遮挡剔除
- Redis学习笔记之六:集合类型Set
- 随机矩形(PeekMessage函数)
- java文件读取常用方法
- Java8 Stream
- Android——XUtils3实现登录和注册页面校验
- 数据集:Udacity Self-Driving 目标检测数据集
- 记录一下post请求方法
- kindeditor设置图片的大小与数量
- 解决由于设置BatchExecutor批量执行器而导致无法获取自增Id的问题
- 网络连接判断的工具类
- 高精度计算2 + 22 + 222 + 2222...(做法1)
- C语言标准预定义的宏