JAVA Stream API
Java Stream API 是JDK 1.8提供的对集合(list set)处理的接口,分为parallelStream
(并行流) 和 Stream
(c串行流)。
下图为Steam中定义的方法:
以下是常用的链式API:
filter
过滤符合条件的元素。
//筛选大于3的元素
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().filter(i->i>3).forEach(System.out::println);
}
map
用于转换元素,接受一个Function作为参数。
public static void main(String[] args) {
List<Person> list = Arrays.asList(new Person("Agge", 20), new Person("Jonas", 25));
list.stream().map(Person::getAge).forEach(System.out::println);
}
forEach
用于执行副作用,它接受一个Consumer作为参数。
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().forEach(System.out::println);
}
collect
用于收集Stream中的元素,返回一个结果。
//根据某个属性去重集合
public static void main(String[] args) {
List<Person> list = Arrays.asList(new Person("Agge", 25), new Person("Jonas", 25));
list.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getAge))),
ArrayList::new)).forEach(System.out::println);
}
reduce
用于将Stream中的元素组合起来,返回一个单一的值。
public static void main(String[] args) {
List<Person> list = Arrays.asList(new Person("Agge", 25), new Person("Jonas", 25));
list.stream().map(Person::getAge).reduce(Integer::sum).ifPresent(System.out::println);
}
mapToDouble、mapToInt、mapToLong
这些方法允许你将Stream中的元素转换为数值类型,并返回对应的DoubleStream、IntStream或LongStream。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
IntStream numberStream = numbers.stream()
.mapToInt(Integer::intValue);
sorted
排序
public static void main(String[] args) {
List<Person> list = Arrays.asList(new Person("Agge", 50), new Person("Jonas", 1),new Person("Jonas", 100));
list.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList()).forEach(System.out::println);
}
anyMatch\ allMatch\ noneMatch
测试是否有任意元素\所有元素\没有元素匹配表达式,返回布尔值
public static void main(String[] args) {
List<Person> list = Arrays.asList(new Person("Agge", 50), new Person("Jonas", 1),new Person("Jonas", 100));
boolean b = list.stream().map(Person::getAge).anyMatch(i -> i > 50);
}
max/min
public static void main(String[] args) {
List<Person> list = Arrays.asList(new Person("Agge", 50), new Person("Jonas", 1),new Person("Jonas", 100));
list.stream().max(Comparator.comparing(Person::getAge)).ifPresent(System.out::println);
}
TODO Comparator 和 Collectors后续补充