java.util.StreamStream 的创建需要指定一个数据源,比如java.util.Collection 的子类,List
或者 Set, Map 不支持
Stream类型
- 串行
- 并行
// 过滤 List排序strings = Arrays.asList("cde", "avc", "qwe", "alk", "eee"); strings.stream() .filter(s -> s.startsWith("a")) .forEach(System.out::println); List strings = Arrays.asList("zz", "vv", "ddd", "cd", "bc"); strings.stream().filter(s -> s.startsWith("z")).forEach(System.out::println);//zz // strings.stream().filter("z"::startsWith).forEach(System.out::println);//沒有 // strings.stream().filter("zz"::startsWith).forEach(System.out::println);//zz // 注意:startsWith,用方法引用的时候,是z当作参数,而lambda是list的每个元素作为参数
List映射s2 = Arrays.asList("cde", "avc", "qwe", "alk", "eee"); s2.stream() .filter(s -> s.startsWith("a")) .sorted() .forEach(System.out::println);
// 映射
List s3 = Arrays.asList("cde", "avc", "qwe", "alk", "eee");
s3.stream().filter(s -> s.startsWith("a"))
.sorted()
.map(s -> s + "yes!")
.forEach(System.out::println);
匹配
List计数s3 = Arrays.asList("cde", "avc", "qwe", "alk", "eee"); boolean b = s3.stream() .anyMatch(s -> s.endsWith("e")); // 有 boolean b1 = s3.stream() .noneMatch(s -> s.endsWith("e"));// 没有 boolean b2 = s3.stream() .allMatch(s -> s.endsWith("e")); // 所有 System.out.println(b + " " + b1 + " " + b2); // true false false
List规约s4 = Arrays.asList("cde", "avc", "qwe", "alk", "eee"); long s1 = s4.stream().filter(s -> s.startsWith("s")).count(); System.out.println(s1); // 0
ListStream->Arrays5 = Arrays.asList("cde", "avc", "qwe", "alk", "eee"); Optional reduce = s5.stream().sorted() .reduce((s1, s2) -> s1 + "," + s2); reduce.ifPresent(System.out::println); // alk,avc,cde,eee,qwe
Listcollectstrings = Arrays.asList("zz", "vv", "ddd", "cd", "bc"); // Stream转成数组 String[] strings1 = strings.stream().toArray(String[]::new); System.out.println(Arrays.toString(strings1));
Liststrings = Arrays.asList("zz", "vv", "zdd", "zcd", "bc"); // collect strings.stream().filter(s -> s.startsWith("z")) .sorted(String::compareTo) .map(s -> s + "!") .collect(Collectors.toList()) .forEach(System.out::println); // 还有 Collectors.toSet
Collectors.toMap
Listlist = new ArrayList(); UserRequest u1 = new UserRequest(); u1.setId(1L); u1.setUserName("u1"); UserRequest u2 = new UserRequest(); u2.setId(2L); u2.setUserName("u2"); list.add(u1); list.add(u2); Map collect = list.stream().collect(Collectors.toMap(UserRequest::getId, Function.identity())); collect.forEach((k, v) -> System.out.println(k + ": " + v));
如果key有一样的则会报错,解决方案如下:
Listjoininglist = new ArrayList(); UserRequest u1 = new UserRequest(); u1.setId(1L); u1.setUserName("u1"); UserRequest u2 = new UserRequest(); u2.setId(1L); u2.setUserName("u2"); list.add(u1); list.add(u2);// (v1,v2)->v2第三个参数表示,如果key的值一样,则用后面添加的作为value// (v1,v2)->v1第三个参数表示,如果key的值一样,则用第一次添加的作为value Map collect1 = list.stream().collect(Collectors.toMap(UserRequest::getId, Function.identity(), (v1, v2) -> v2)); collect1.forEach((k, v) -> System.out.println(k + ": " + v));
list变为字符串
String z = strings.stream().filter(s -> s.startsWith("z")) .sorted(String::compareTo) .map(s -> s + "!") .collect(Collectors.joining(","));
延迟执行
@Testpublic void laziness(){ List strings = Arrays.asList("abc", "def", "gkh", "abc"); Stream stream = strings.stream().filter(new Predicate() { @Override public boolean test(Object o) { System.out.println("Predicate.test 执行"); return true; } }); System.out.println("count 执行"); stream.count();}count 执行Predicate.test 执行Predicate.test 执行Predicate.test 执行Predicate.test 执行// 按执行顺序应该是先打印 4 次「Predicate.test 执行」,再打印「count 执行」。实际结果恰恰相反。说明 filter 中的方法并没有立刻执行,而是等调用count()方法后才执行。
Parallel Stream
并行流
串行Stream是一个线程依次完成,并行流是多个线程同时进行
int max = 10000000; Listlist = new ArrayList(); for (int i = 0; i < max; i++) { UUID uuid = UUID.randomUUID(); list.add(uuid.toString()); } long startTime = System.currentTimeMillis(); list.parallelStream().sorted(); long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime);



