聚合方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Test
public void streamJuHe() {
long count = Stream.of("a", "b", "c", "da", "asdass").count();
System.out.println(count);
Optional<String> max = Stream.of("a", "b", "c", "da", "asdass").max(
String::compareToIgnoreCase);
Optional<String> min = Stream.of("a", "b", "c", "da", "asdass").min(
String::compareToIgnoreCase);
System.out.println(max.get());
System.out.println(min.get());
Optional<String> first = Stream.of("a", "b", "c", "da", "asdass").findFirst();
System.out.println(first.get());
Optional<String> any = Stream.of("a", "b", "c", "da", "asdass")
.filter(s -> s.startsWith("a")).findAny();//匹配任何一个,可以使用 parallel 方法并行处理
System.out.println(any.get());
}

Optional 类型

Optional 可以通过 get 方法来获取被封装的对象,但是这样有可能出现空指针之类的异常,所以还需要自己来判断,但是 Optional 也有另外的一个方法 ifPresent, 这个方法接收一个函数参数,表示如果存在值则执行这个函数,不存在则不操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void optionalTest() {
Optional<String> max = Stream.of("a", "b", "c", "da", "asdass").max(
String::compareToIgnoreCase);
max.ifPresent(System.out::print);
List<String> reList = new ArrayList<String>();
Optional<Boolean> added = max.map(reList::add);
max.orElse("default");// 如果max不存在值返回默认值
max.orElseGet(() -> "empty");
max.orElseThrow(RuntimeException::new);

Optional<String> optional = Optional.of("ads");
Optional<String> optional2 = Optional.empty();
}

聚合操作

1
2
3
4
5
6
7
8
@Test
public void juhe() {
Stream<Integer> values = Stream.of(1, 3, 5, 6, 7);
Optional<Integer> sum = values.reduce(Integer::sum);
Optional<Integer> sum1 = values.reduce((x, y) -> x + y);
System.out.println(sum.get());
System.out.println(sum1.get());
}

上面的例子表示是我们计算数字的合操作。如果流是空的就无法计算产生有效的结果。

一般是聚合操作有一个操作 op,那么该聚合会产生 v0 op v1 op v2 op v3 等等。其中 vi op v(i+1) 用函数表达就是 op(vi, v(i+1))。

一般聚合操作是联合的,即 op 操作的顺序无关系,像加法、乘法、求最大值、字符串追加等。减法则不是联合操作。

当我们的流是一个空的时候,返回的 Optional 是没有数据的,我们也可以使用下面的例子。

1
Integer sum2 = values.reduce(0, Integer::sum);

收集结果

当流操作完成之后,我们可以产生一个结果。可以通过 toArray 方法来转换成数组。因为 toArray 放回的是 Object[] 类型的数组,如果我们想得到一个正确的类型数组,可以如下方法:

1
2
3
4
5
@Test
public void getResult() {
Stream<String> stream = Stream.of("a", "b", "c", "da", "asdass");
String[] arr = stream.toArray(String[]::new);
}

如果要把结果收集到 HashSet 当中,可以使用 collect 方法,它接受三个参数:

  1. 一个能创建目标实例的方法,例如 HashSet 的构造方法
  2. 一个能把元素添加到目标的方法,add 方法
  3. 一个可以把两个对象整合到一起的方法,addAll 方法
1
2
3
4
5
6
7
@Test
public void getResult() {
Stream<String> stream = Stream.of("a", "b", "c", "da", "asdass");
// String[] arr = stream.toArray(String[]::new);
HashSet<String> set = stream.collect(HashSet::new, HashSet::add, HashSet::addAll);
System.out.println(set);
}

【参考资料】

  1. 写给大忙人看的Java SE 8

—EOF—