stream写法

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(Arrays.asList("I", "love", "you", "too"));
for(String str : list){
if(str.length()>3)
System.out.println(str);
}
list.forEach(str->System.out.println(str));
list.stream().filter(str->str.length()>3).forEach(System.out::println);
}

用stream的filter来替代if/else业务逻辑

1
2
3
4
5
6
7
8
9
for(int i=0;i<10;i++){
if(....){
//...........
}else{
//.......
}
}

list.stream().filter().limit(10).foreach();

Stream

流创建

1
2
3
4
5
6

List<String> list = Arrays.asList("hello","world","stream");
//创建顺序流
Stream<String> stream = list.stream();
//创建并行流
Stream<String> parallelStream = list.parallelStream();

静态方法

of()、iterate()、generate()

1
2
3
4
5
6
7
8
Stream<String> stream1 = Stream.of("I", "love", "you", "too");
stream1.forEach(System.out::println);

Stream<Integer> stream2 = Stream.iterate(0, i -> i + 2).limit(3);
stream2.forEach(System.out::println);

Stream<Boolean> stream3 = Stream.generate(new Random()::nextBoolean).limit(3);
stream3.forEach(System.out::println);

并行流 多线程 把一个内容分成多个数据块 不同线程分别处理每个数据块的流,最后合并(无序数据处理)

1
Optional<Integer> findFirst = list.stream().parallel().filter( x -> x>4 ).findFirst();

可以通过parallel()把顺序流转换成并行流

中间操作

无状态(Stateless)

指元素的处理不受之前元素的影响

filter

筛选,是按照一定的规则校验流中的元素,将符合条件的元素提取到新的流中的操作

1
list.stream().filter(str->str.length()>3).forEach(System.out::println);

相当于if

映射(map、flatMap、peek)
map
1
2
3
4
List<String> out =  list.stream().
map(String::toUpperCase).
collect(Collectors.toList());
System.out.println(out);//[I, LOVE, YOU, TOO]
1
2
3
4
5
6
7
8
9
10
11
List<Product> list = new ArrayList<>();
Test t = new Test();

list.add(t.new Product(1, "domestic phone", new BigDecimal(6899.99)));
list.add(t.new Product(2, "overseas notebook", new BigDecimal(14989.98)));

String out = list.stream().
//map(a->a.name.split(" ")[1]).//phone&&notebook
map(a->a.name.replaceAll(" ", "-")).//domestic-phone&&overseas-notebook
collect(Collectors.joining("&&"));
System.out.println(out);
flatMap
1
2
3
4
5
6
7
List<String> list = Arrays.asList("a:b:c", "1:3:5");
List<String> listNew = list.stream().
flatMap(s -> Arrays.stream(s.split(":")) ).
collect(Collectors.toList());

System.out.println("处理前的集合:" + list);
System.out.println("处理后的集合:" + listNew);

处理前的集合:[a:b:c, 1:3:5]
处理后的集合:[a, b, c, 1, 3, 5]

peek
1
2
Stream<String> stream = Stream.of("hello", "world");
stream.peek(System.out::println).collect(Collectors.toList());

终端操作。通常分为 最终的消费foreach 之类的)和 归纳collect)两类。

有状态(Stateful)

指该操作只有拿到所有元素之后才能继续下去

distinct

使用hashCode()和equals()方法来获取不同的元素

1
2
3
Stream<String> stream = Stream.of("1", "3","4","10","4","6","23","3");
stream.distinct().forEach(System.out::println);

sorted
1
2
3
4
5
6
7
HashMap<Integer, String> map = new HashMap<>();
map.put(1,"phone");
map.put(2,"notebook");
map.entrySet().stream().sorted(
Collections.reverseOrder(Map.Entry.comparingByKey())//倒序
//Comparator.comparing(e -> e.getKey())//正序
).forEach(System.out::println);
skip
1
2
Stream<Integer> stream = Stream.of(3,1,10,16,8,4,9);
stream.limit(3).skip(2).forEach(System.out::print);

limit(3) Iloveyou

skip(2) you

终结操作

短路(Short-circuiting)

指遇到某些符合条件的元素就可以得到最终结果

anyMatch

Stream 中只要有一个元素符合传入的 predicate,返回 true

1
stream.anyMatch(s->s==2)
allMatch

Stream 中全部元素符合传入的 predicate,返回 true

noneMatch

Stream 中没有一个元素符合传入的 predicate,返回 true

findFirst

用于返回满足条件的第一个元素

1
2
3
4
5
ArrayList<String> list = new ArrayList<>(Arrays.asList("I", "love", "you", "too"));
System.out.println(
list.stream().filter(s-> s.length()>2).findFirst().get()
);

findAny

返回流中的任意元素

1
2
3
System.out.println(
list.parallelStream().filter(s-> s.length()>2).findAny().get()
);

love 或 you

并行数据多返回满足第一个

非短路(Unshort-circuiting)

指必须处理完所有元素才能得到最终结果

reduce

reduce操作效率不高,因为它创建了大量的中间StringStringBuilder

1
2
3
list.stream().
map(a->a.name.replaceAll(" ", "-")).
reduce((str1, str2) -> str1 + "&&" + str2).get();

等价 collect(Collectors.joining(“&&”))

toArray
1
2
3
 Product[] array = list.stream().toArray(Product[]::new);
//Arrays.stream(array).sorted(Comparator.comparing(s>s.getId())).forEach(System.out::println);
Arrays.stream(array).filter(s->s.id>1).forEach(System.out::println);
点击打赏
文章目录
  1. 1. Stream
    1. 1.1. 流创建
      1. 1.1.1. 静态方法
    2. 1.2. 中间操作
      1. 1.2.1. 无状态(Stateless)
        1. 1.2.1.1. filter
        2. 1.2.1.2. 映射(map、flatMap、peek)
          1. 1.2.1.2.1. map
          2. 1.2.1.2.2. flatMap
          3. 1.2.1.2.3. peek
      2. 1.2.2. 有状态(Stateful)
        1. 1.2.2.0.1. distinct
        2. 1.2.2.0.2. sorted
        3. 1.2.2.0.3. skip
  2. 1.3. 终结操作
    1. 1.3.1. 短路(Short-circuiting)
      1. 1.3.1.0.1. anyMatch
      2. 1.3.1.0.2. allMatch
      3. 1.3.1.0.3. noneMatch
      4. 1.3.1.0.4. findFirst
      5. 1.3.1.0.5. findAny
  3. 1.3.2. 非短路(Unshort-circuiting)
    1. 1.3.2.0.1. reduce
    2. 1.3.2.0.2. toArray
载入天数...载入时分秒... ,