– Start
点击此处观看本系列配套视频。
从之前的例子我们可以看到,Stream 接口是 Java 函数式编程的核心接口,下面我们来了解一下 Stream 接口。
构造 Stream
通常我们都是调用 Java集合的 stream 方法得到 Stream 对象,当然还有其他一些方法得到 Stream 对象。
package shangbo.functional.demo13;
import java.util.ArrayList;
import java.util.stream.Stream;
public class App {
public static void main(String[] args) {
// 调用 Java 集合的 stream 方法得到 Stream 对象
Stream<String> stream1 = new ArrayList<String>().stream();
// 数组转 Stream
Stream<String> stream2 = Stream.of(new String[] {"a", "b"});
// 包含一个元素的 Stream
Stream<String> stream3 = Stream.of("a");
// 空 Stream
Stream<String> stream4 = Stream.empty();
// 将多个 Stream 组合成一个 Stream
Stream<String> stream5 = Stream.concat(stream1, stream2);
}
}
Steam 非终止方法(Non-terminal)
Steam 包含两种类型的方法,一种方法的返回值是 Steam, 这样我们就可以将多个方法调用连接起来,这种方法称为非终止方法,有以下方法。
Stream.filter()
Stream.distinct()
Stream.limit()
Stream.peek()
Stream.skip()
Stream.sorted()
Stream.map()
Stream.mapToDouble()
Stream.mapToInt()
Stream.MapToLong()
Stream.flatMap()
Stream.flatMapToDouble()
Stream.flatMapToInt()
Stream.flatMapToLong()
下面我们演示一下 skip, peek 和 flatMap 的用法,其他方法我们已经演示过了。
package shangbo.functional.demo14;
import java.util.ArrayList;
import java.util.List;
public class App {
public static void main(String[] args) {
List<List<String>> listOfList = new ArrayList<>();
List<String> a = new ArrayList<>();
a.add("a1");
a.add("a2");
listOfList.add(a);
List<String> b = new ArrayList<>();
b.add("b1");
b.add("b2");
b.add("b3");
listOfList.add(b);
// flatMap 用來复杂数据结构扁平化
// skip 用来跳过指定数量的元素
// peek 不对数据做任何修改
listOfList.stream().flatMap(l->l.stream()).skip(2).peek(e->System.out.println(e)).count();
}
}
Stream 终止方法
Stream 的另一种方法称为终止方法,有以下方法。
Stream.collect()
Stream.count()
Stream.min()
Stream.max()
Stream.allMatch()
Stream.anyMatch()
Stream.noneMatch()
Stream.findAny()
Stream.findFirst()
Stream.forEach()
Stream.forEachOrdered()
Stream.reduce()
Stream.toArray()
package shangbo.functional.demo15;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class App {
public static void main(String[] args) {
List<String> data = new ArrayList<>();
data.add("one");
data.add("two");
data.add("three");
// 是否找到匹配元素
boolean anyMatch = data.stream().anyMatch(v -> v.equalsIgnoreCase("ONE"));
System.out.println("anyMatch=" + anyMatch);
// 是否匹配所有元素
boolean allMatch = data.stream().allMatch(v -> v.equalsIgnoreCase("ONE"));
System.out.println("allMatch=" + allMatch);
// 是否沒有匹配元素
boolean noneMatch = data.stream().noneMatch(v -> v.equalsIgnoreCase("ONE"));
System.out.println("noneMatch=" + noneMatch);
// 返回任意一個元素
Optional<String> anyElement = data.stream().findAny();
if (anyElement.isPresent()) {
System.out.println("anyElement=" + anyElement.get());
}
// 返回第一個元素
System.out.println("firstElement=" + data.stream().findFirst().orElse(null));
// reduce 只返回一个值
System.out.println("firstElement=" + data.stream().reduce((p1, p2) -> p1 + "," + p2).orElse(null));
// Steam 转数组
String[] array = data.stream().toArray(String[]::new);
}
}
此外 Steram 的子接口中还有一些特殊的方法,请看 IntSteram, LongSteram , DoubleSteram API 文档。
– 更多参见:Java 函数式编程精萃
– 声 明:转载请注明出处
– Last Updated on 2019-06-01
– Written by ShangBo on 2019-06-01
– End