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

541 阅读1分钟

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

使用Predicate操作集合

Java8为Collection集合新增了一个removeIf(Predicate filter)方法,该方法会批量删除符合filter的条件的所有元素。该方法需要一个Predicate对象作为参数,也是一个函数式接口,因此可以使用Lambda表达式来作为参数。

来看下例子吧。

public class Main {
	public static void main(String[] args) {
		Collection c = new ArrayList();
		c.add(1);
		c.add(2);
		c.add(3);
		c.add(4);
		c.add(5);
		//删除集合c中小于3的元素
		c.removeIf(obj ->(Integer)obj < 3);
		System.out.println(c);
	}
}

在编程时,可能会有很多的统计需求,这时我们可以重写Predicate中的test()方法。 来看下面例子

public class Main {
	public static void main(String[] args) {
		Collection c = new ArrayList();
		c.add(1);
		c.add(2);
		c.add(3);
		c.add(4);
		c.add(5);
		c.add(6);
		c.add(7);
		c.add(8);
		c.add(9);
		//利用Predicate的条件,筛选多个统计需求,减少循环代码。
		System.out.println(count(c,obj -> (Integer)obj < 3));
		System.out.println(count(c,obj -> (Integer)obj < 6));
		System.out.println(count(c,obj -> (Integer)obj < 9));
	}
	public static int count(Collection c , Predicate predicate){
		int total = 0;
		for(Object i : c){
			//使用Predicate的test()方法,判断是否满足条件
			if(predicate.test(i)){
				total++;
			}
		}
		return total;
	}
}

使用Stream操作集合

Stream是一个通用的流接口,除了Stream外还有IntStream、LongStream、DoubleStream,代表元素类型为int,long,double的流。 Java8还对每个流提供了对象的Bulider。

独立使用Stream的步骤为:

使用Stream或XxxStream的bulider类方法创建该Stream对应的的Bulider。
重复调用Bulider的add()方法向该流中添加多个元素。
调用Bulider的bulid()方法获取对应的Stream。
调用Stream的聚集方法。

Stream中有很多聚集方法,对于大部分聚集方法而言只能执行一次,这些方法既可以是“中间的”,也可以是“末端的”。

中间操作允许流保持打开状态,并允许直接调用后续方法,中间方法返回的是一个流。

末端方法是对流的最终操作,当末端方法执行结束时,该流将会被消耗,且不可再用。

下期对Stream的方法进行详解。