【浅谈Java的Predicate和Stream操作集合】(下)

908 阅读3分钟

这是我参与更文挑战的第18天,活动详情查看: 更文挑战

上期我们已经介绍了Predicate的简单用法和Stream的简单介绍,这期我们一起来学习Stream的更深入的了解和Stream常用的一些中间方法和末端方法。

什么是Stream?

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream(流)是一个来自数据源的元素队列并支持聚合操作。Stream并不会存放数据,而是按需计算。数据源 流的来源,可以是集合,数组,I/O channel, 产生器generator 等。

Stream常用中间方法

中间方法返回的是一个新的流

  1. filter(Predicate predicate):过滤Stream中所有不符合predicate的元素。
  2. mapToXxx(ToXxxFunction mapper):使用ToXxxFunction对流中的元素执行一对一的转换,该方法返回的新流中包含了ToXxxFUnction转换生成的所有元素。
  3. peek(Consumer action):依次对每个元素执行一些操作,该方法返的流与原有流包含的元素相同。
  4. distinct():该方法用于去除流中重复的元素(对于对象不行,因为new出来的对象的地址不同)
  5. sorted():保证流中的元素在后续的访问中处于有序的状态。
  6. limit(long maxSize):该方法保证对流的后续访问中最大允许的元素个数。

在 Java 8 中, 集合接口有两个方法来生成流:

stream() − 为集合创建串行流。

parallelStream() − 为集合创建并行流。
public class Test {
	public static void main(String[] args) {
		//创建一个数组作为集合,不能使用增加,删除,只能用来遍历
		List<String> stringList =  Arrays.asList("ab","cd","gh","ad","ab","gh");
		//调用Stream的filter方法,把集合成流,然后再把流转为集合collect(Collectors.toList())
		List<String> filtered = stringList.stream().filter(obj -> obj.contains("d")).collect(Collectors.toList());
		//输出[cd, ad]
		System.out.println(filtered);
		//distinct去除重复元素
		List<String> distincted = stringList.stream().distinct().collect(Collectors.toList());
		System.out.println(distincted);
		//limit获取流中前n个元素
		List<String> limited = stringList.stream().limit(3).collect(Collectors.toList());
		System.out.println(limited);
		//skip获取流中除了前n个元素以外的元素
		List<String> skipped = stringList.stream().skip(3).collect(Collectors.toList());
		System.out.println(skipped);
		//map对流中所有的元素做统一处理
		List<String> mapped = stringList.stream().map(obj -> "Gw_"+obj).collect(Collectors.toList());
		System.out.println(mapped);
		//sorted 保证流中的元素在后续的访问中处于有序的状态。
		List<String> sorted = stringList.stream().sorted().collect(Collectors.toList());
		System.out.println(sorted);
  	}
}

Stream常用末端方法

  1. forEach(Consumer action):遍历流中所有的元素,对每个元素执行action
  2. toArray():将流中的元素转为一个数组
  3. reduce():通过某种操作来合并流中的元素
  4. min():返回流中最小的元素
  5. max():返回流中最大的元素
  6. count():返回流中元素的数量
  7. anyMatch(Predicate predicate):判断流中是否至少含有一个元素符合Predicate条件
  8. allMatch(Predicate predicate):判断流中是否每个元素符合Predicate条件
  9. noneMatch(Predicate predicate):判断流中是否每个元素都不符合Predicate条件
  10. findFirst():返回流中第一个元素
  11. findAny():返回流中任意一个元素(使用Stream时通常返回第一个,使用parallelStream()时,返回任意一个)
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
	public static void main(String[] args) {
		//创建一个数组作为集合,不能使用增加,删除,只能用来遍历
		List<String> stringList =  Arrays.asList("ab","cd","gh","ad","ab","gh");
		//判断流中是否至少含有一个元素符合Predicate条件
		System.out.println(stringList.stream().anyMatch(str -> str.equals("ad")));
		//判断流中是否每个元素符合Predicate条件
		System.out.println(stringList.stream().allMatch(str -> str.contains("d")));
		//判断流中是否每个元素都不符合Predicate条件
		System.out.println(stringList.stream().noneMatch(str -> str.contains("d")));
		//返回流中第一个元素
		System.out.println(stringList.stream().findFirst());
		//返回流中任意一个元素,使用Stream时通常返回第一个,使用parallelStream()时,返回任意一个
		System.out.println(stringList.stream().findAny());
		//返回流中元素的数量
		System.out.println(stringList.stream().count());
		//遍历流中所有的元素,对每个元素执行action
		stringList.stream().forEach(str -> System.out.println(str));
  	}
}