Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:
它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表
Lambda的使用场景多用于集合
-
流
流是Java API的新成员,它允许你以声明性方式处理数据集合,简而言之,可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,无需写任何多线程代码
-
pojo
public class Dish { private String name; private Integer calories; private Double price ; public Dish(){ } public Dish(String name , Integer calories,Double price) { this.name = name; this.calories = calories; this.price=price ; } }
测试数据
public static List<Dish> toLists(){ return Arrays.asList( new Dish("青菜", 700,800.0), new Dish("黄瓜", 700 ,300.0), new Dish("鱼香肉丝", 2000 ,400.0), new Dish("红烧土豆", 730 ,400.0), new Dish("土豆丝", 850 ,600.0), new Dish("红烧鱼", 3000 ,3000.0), new Dish("西红柿鸡蛋", 1050 ,600.0), new Dish("炒三鲜", 1300 ,800.0), new Dish("竹笋炒肉", 2450,1000.0 ) ); } public static List<Integer> toNumbers(){ return Arrays.asList(1,2,3,4); }
-
筛选操作
filter()过滤、 distinct() 它会返回一个元素的流
@Test public void test(){//以菜名大于3位数的过滤,选择3条数据并输出 toLists().stream().filter(d->d.getName().length()>3).limit(3).distinct().forEach(s-> System.out.println(s)); }
-
查找匹配操作
StreamAPI通过 allMatch 、 anyMatch 、 noneMatch 、 findFirst 和 findAny 方法提供了这样的工具。某些操作不用处理整个流就能得到结果。只要找到一个元素,就可以有结果
@Test public void test2(){//菜单中所有菜色价格是否全都2000元以上 Boolean temp = toLists().stream().allMatch(d->d.getPrice()>2000); System.out.println(temp);// 满足条件 true 否则 false } @Test public void test3(){//找到第一个数据,直接返回 Optional<Dish> any = toLists().stream().filter(s -> s.getName().length() > 2).findAny(); System.out.println(any); }
-
归约
把一个流中的元素组合起来,使用 reduce 操作来表达更复杂的查询
reduce 接受两个参数: 一个初始值,这里是0; 一个 BinaryOperator<T> 来将两个元素结合起来产生一个新值 @Test public void test4(){ Integer sum = toNumbers().stream().reduce(0, Integer::sum) ; // System.out.println(sum); int product = toNumbers().stream().reduce(1, (a, b) -> a * b); System.out.println(product); /*int count = toLists().stream() .map(d -> 1) .reduce(0, (a, b) -> a + b); System.out.println(count);*/ }
-
-
map,多条件筛选
List<String> names = new ArrayList<>();
names.add("TaoBao");
names.add("ZhiFuBao");
names.stream().map(name -> {
assert name != null;
return name.toLowerCase();
}).forEach(System.out::println);
- stream 与List、数组 转换
List<String> strList = Arrays.asList("A", "A", "D", "E", "C", "E");
List<String> collect =strList.stream().distinct().collect(Collectors.toList());
Object[] objects = strList.stream().distinct().toArray();
参考书籍:《Java 8实战》