JDK 8 引入了 Stream API,它是用于处理集合数据的功能强大的库。Stream API 提供了一种更为简洁、灵活和函数式的方式来进行集合的操作和处理。
Stream API 有三大特性:
在使用 Stream API 进行集合操作时,一般会遵循以下步骤:
其中中间操作又分为,无状态和有状态,结束操作又分为短路操作和非短路操作
可以使用 Collection
接口中的 stream()
方法或者 parallelStream()
方法来创建一个流
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
可以使用 Arrays
类中的静态方法 stream()
来创建一个数组的流
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
可以使用 Stream
类中的静态方法 of()
来根据指定的元素创建一个流
Stream<String> stream = Stream.of("a", "b", "c");
元素的处理不受前一个元素影响
Predicate
参数,根据 Predicate
的判断结果决定是否保留流中的元素, true
留下,false
丢弃Function
参数,将流中的每个元素通过该函数进行转换,mapToInt、mapToLong、mapToDouble 和 map 差不多,只是强制指定了返回值必须是 int、long、double 类型Consumer
函数作为参数,该函数会在流的每个元素被处理时被调用。它可以用于在处理流的过程中观察每个元素的值,而不会改变流的内容//filter
public static void main(String[] args) {
String[] str = {"a", "b", "c"};
Stream.of(str).filter(t -> t.equals("a")).forEach(System.out::println);
//输出
//a
}
//map、mapToInt、mapToLong、mapToDouble
public static void main(String[] args) {
String[] str = {"a", "b", "c"};
Stream.of(str).map(t -> t.toUpperCase()).forEach(System.out::println);
Stream.of(str).mapToInt(t -> t.hashCode()).forEach(System.out::println);
//输出
//A
//B
//C
//97
//98
//99
}
//flatMap、flatMapToInt、flatMapToLong、flatMapToDouble
public static void main(String[] args) {
List<String> a = new ArrayList<>();
a.add("a");
a.add("b");
List<String> b = new ArrayList<>();
b.add("c");
b.add("d");
Stream.of(a, b).flatMap(u -> u.stream()).forEach(System.out::println);
//输出
//a
//b
//c
//d
}
//peek
public static void main(String[] args) {
String[] str = {"a", "b", "c"};
Stream.of(str).peek(t -> System.out.println("this is " + t)).collect(Collectors.toList());
//输出
//this is a
//this is b
//this is c
}
必须等所有元素处理完毕之后才知道最终的结果
//distinct
public static void main(String[] args) {
String[] str = {"a", "a", "b", "b", "c"};
Stream.of(str).distinct().forEach(System.out::println);
//输出
//a
//b
//c
}
//sorted
public static void main(String[] args) {
String[] str = {"banana", "apple", "pineapple", "pear", "watermelon"};
Stream.of(str).sorted().forEach(System.out::println);
System.out.println("---------------");
Stream.of(str).sorted(Comparator.comparing(String::length)).forEach(System.out::println);
//输出
//apple
//banana
//pear
//pineapple
//watermelon
//---------------
//pear
//apple
//banana
//pineapple
//watermelon
}
//limit
public static void main(String[] args) {
String[] str = {"a", "b", "c", "d", "e"};
Stream.of(str).limit(2).forEach(System.out::println);
//输出
//a
//b
}
//skip
public static void main(String[] args) {
String[] str = {"a", "b", "c", "d", "e"};
Stream.of(str).skip(2).forEach(System.out::println);
//输出
//c
//d
//e
}
需要处理完所有元素
//forEach
public static void main(String[] args) {
String[] str = {"a", "b", "c"};
Stream.of(str).forEach(System.out::println);
//输出
//a
//b
//c
}
//toArray
public static void main(String[] args) {
String[] str = {"1", "2", "3"};
Object[] objectArray = Stream.of(str).toArray();
String[] strArray = Stream.of(str).toArray(String[]::new);
}
//reduce
public static void main(String[] args) {
Integer[] array = {1, 2, 3, 4, 5};
Optional<Integer> optional = Stream.of(array).reduce((x, y) -> x + y);
optional.ifPresent(System.out::println);
//输出
//15
}
//collect
public static void main(String[] args) {
Integer[] array = {1, 2, 3, 4, 5};
List<Integer> list = Stream.of(array).collect(Collectors.toList());
System.out.println(list);
//输出
//[1, 2, 3, 4, 5]
}
//min
public static void main(String[] args) {
Integer[] array = {1, 2, 3, 4, 5};
Optional<Integer> min = Stream.of(array).min(Comparator.comparing(Integer::intValue));
min.ifPresent(System.out::println);
//输出
//1
}
//max
public static void main(String[] args) {
Integer[] array = {1, 2, 3, 4, 5};
Optional<Integer> max = Stream.of(array).max(Comparator.comparing(Integer::intValue));
max.ifPresent(System.out::println);
//输出
//5
}
//count
public static void main(String[] args) {
String[] str = {"a", "b", "c"};
long count = Stream.of(str).count();
System.out.println(count);
//输出
//3
}
一旦满足或不满足条件,就结束计算,不用处理完所有元素
//anyMatch
public static void main(String[] args) {
String[] str = {"banana", "apple", "pineapple", "pear", "watermelon"};
boolean b = Stream.of(str).anyMatch(t -> t.length() == 4);
boolean b2 = Stream.of(str).anyMatch(t -> t.length() == 3);
System.out.println(b);
System.out.println(b2);
//输出
//true
//false
}
//allMatch
public static void main(String[] args) {
String[] str = {"banana", "apple", "pineapple", "pear", "watermelon"};
boolean b = Stream.of(str).allMatch(t -> t.length() >= 4);
boolean b2 = Stream.of(str).allMatch(t -> t.length() >= 5);
System.out.println(b);
System.out.println(b2);
//输出
//true
//false
}
//noneMatch
public static void main(String[] args) {
String[] str = {"banana", "apple", "pineapple", "pear", "watermelon"};
boolean b = Stream.of(str).noneMatch(t -> t.length() >= 4);
boolean b2 = Stream.of(str).noneMatch(t -> t.length() <= 3);
System.out.println(b);
System.out.println(b2);
//输出
//false
//true
}
//findFirst
public static void main(String[] args) {
String[] str = {"banana", "apple", "pineapple", "pear", "watermelon"};
Optional<String> first = Stream.of(str).findFirst();
first.ifPresent(System.out::println);
//输出
//banana
}
//findAny
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.parallelStream()
.filter(n -> n % 2 == 0)
.findAny().ifPresent(System.out::println);
//输出
//2 or 4
}