lambda表达式过滤list集合 (lambda表达式集合操作)

在上一篇中我们知道了Lambda表达式和基本的应用,当然上篇主要只是基于Lambda表达式完成接口的实例化。也是日常用的最多的。

本篇我们就聊聊Lambda表达式操作集合的一些方式,其实主要是基于JAVA8的stream包和function包。

Lambda操作集合:Stream

Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,

而中间操作返回Stream本身,这样你就可以将多个操作依次串起来(链式编程)。

Stream 的创建需要指定一个数据源,比如 java.util.Collection的子类,List或者Set, Map不支持。

Stream的操作可以串行执行或者并行执行。Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。同时提供串行和并行两种模式进行汇聚操作。

语法格式:

(参数)->{语句块}

其中只有一个参数的化()可以省略

Lambda表达式可以实现的操作:

1、中间操作

包括但不局限于:map、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 unordered等

示例:

public class Lambda_Test {

private List<Integer>scores=new ArrayList<>();

//map 生成的是个1:1映射,每个输入元素,都按照规则转换成为另外一个元素

@Test

public void test1(){

Collections.addAll(scores,new Integer[]{11,22,33,6,2,44});

//Java 8 允许你使用 :: 关键字来传递方法(静态方法和非静态方法)

//遍历输出

scores.stream().map(n->n*2).forEach(System.out::println);

}

//filter 通过一个predicate接口来过滤并只保留符合条件的元素,该操作属于中间操作

@Test

public void test2(){

Collections.addAll(scores,new Integer[]{11,22,33,6,2,44});

//输出元素为偶数

scores.stream().filter(n->n%2==0).forEach(System.out::println);

}

//sorted 排序是一个中间操作,返回的是排序好后的Stream

@Test

public void test3(){

Collections.addAll(scores,new Integer[]{11,22,33,6,2,44});

//降序排列

scores.stream().sorted((n1,n2)->n2-n1).forEach(System.out::println);

}

}

2、最终操作

包括但不局限于:forEach、 toArray、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator等

代码如下:

//min 最小值 需要比较器

//max 最大值 需要比较器

//count 元素个数 无参

@Test

public void test4(){

Collections.addAll(scores,new Integer[]{11,22,33,6,2,44});

//最小值

System.out.println("最小值:"+scores.stream().min((n1,n2)->n1-n2).get());

//最大值

System.out.println("最大值:"+scores.stream().max((n1,n2)->n1-n2).get());

//计数

System.out.println("元素个数:"+scores.stream().count());

}

//anyMatch 只要有任意一个匹配就烦true

@Test

public void test5(){

List<String> list=new ArrayList<>();

Collections.addAll(list,new String[]{"qianfeng","java","Android","BgiData","Python"});

//校验元素内容是否包含a

System.out.println(list.stream().anyMatch(n->n.contains("a")));

}

//findFirst 总是返回 Stream 的第一个元素,或者空

@Test

public void test6(){

List<String> list=new ArrayList<>();

Collections.addAll(list,new String[]{"qianfeng","java","Android","BgiData","Python"});

//校验元素内容是否包含a

System.out.println(list.stream().findFirst().get());

}