java 8 新特性 Stream
Stream是什么?
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
Stream的优点
1.代码简洁,函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。
2.多核友好,Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。
Steam的常用操作
- forEach
Stream 提供了新的方法 ‘forEach’ 来迭代流中的每个数据。以下代码片段使用 forEach 输出排序好的数列:
Stream.of(5, 4, 3, 2, 1)
.sorted()
.forEach(System.out::println);
// 打印结果
// 1,2,3,4,5
- of
生成有线长度的Stream,其长度为内部元素的个数
Stream<Integer> integerStream = Stream.of(1, 2, 3);
Stream<String> stringStream = Stream.of("A");
- map
map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的大写形式:
Stream.of("a", "b", "hello")
.map(item-> item.toUpperCase())
.forEach(System.out::println);
// 打印结果
// A, B, HELLO
- distinct
distinct方法以达到去除掉原Stream中重复的元素,生成的新Stream中没有没有重复的元素。
Stream.of(1,2,3,1,2,3)
.distinct()
.forEach(System.out::println); // 打印结果:1,2,3
- filter
filter是stream中的有力工具,可以对stream按指定的条件过滤,在新的stream中只含有符合条件的元素。
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.stream().filter(string -> string.isEmpty()).count();
//count == 2
- limit
limit方法将截取原Stream,截取后Stream的最大长度不能超过指定值N。如果原Stream的元素个数大于N,将截取原Stream的前N个元素;如果原Stream的元素个数小于或等于N,将截取原Stream中的所有元素。
Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);
//打印10个随机数
- sorted
sorted是对stream中的元素按规定来排序的方法。其中有两种形式sorted(),sorted(Comparator),前者将默认使用Object.equals(Object)进行排序,而后者接受一个自定义排序规则函数(Comparator),可按照意愿排序。
Map<String,Integer> targetMap = graph.targets(words[i].toLowerCase());
Map<String, Integer> sourceMap = graph.sources(words[i+1].toLowerCase());
Set<String> elementOfTarget = targetMap.keySet();
List<String> sortedOnWeight = elementOfTarget.stream()
.filter(string -> sourceMap.containsKey(string))
.sorted((String s1,String s2)->
{return targetMap.get(s2)+sourceMap.get(s2)-
targetMap.get(s1)-sourceMap.get(s1);})
.collect(Collectors.toList());
//将图中作为两点桥梁的点按到该桥点的入边和出边的权值大小给这些桥点排序
- Collectors
Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);
其中Collectores.tolist()能将stream的对象聚合成[“abc”,“bd”,“efg”,“abcd”,“jkl”]的list
而Collectors.joining(", ")则会生成"abc,bd,efg,abcd,jkl"的String
Collectors.joining()方法详见:https://blog.csdn.net/qq_43319321/article/details/89095543