素材巴巴 > 程序开发 >

Java中 filter()函数的用法

程序开发 2023-09-09 23:39:16

Java中filter函数的用法

  • 造数以及测试类代码
  • 测试结果
  • 参考资料链接:
  • 介绍

    Java 8 Stream接口引入了filter()方法,可用于根据特定条件从对象集合中过滤出某些元素。这个条件应该指定为filter()方法接受作为参数的谓词。

    predicate接口定义了一个名为test()的抽象方法,该方法接受泛型类型T的对象并返回一个布尔值。

    让我们编写一些代码,以便更清楚地理解filter方法。看看下面的Dish类。

    详细代码

    package com.liu.filter;/*** @Decision TODO* @author liusx* @Date 2021年8月17日*/
     public class Dish {private String name;private Boolean vegitarian;private Integer calaries;private Type type;public Dish(String name, Boolean vegitarian, Integer calaries, Type type) {super();this.name = name;this.vegitarian = vegitarian;this.calaries = calaries;this.type = type;}public Boolean getVegitarian() {return vegitarian;}public void setVegitarian(Boolean vegitarian) {this.vegitarian = vegitarian;}public Type getType() {return type;}public void setType(Type type) {this.type = type;}public enum Type { MEAT, FISH, OTHER };}

    让我们想想,我们想要从所有菜的列表中只过滤素食菜。下面是Java 8之前的方法。

    Java8之前的写法

    public static List getVegetarianDishes_old(List menus) {List vegetarianDishes = new ArrayList();//找是蔬菜的菜单for (Dish d : menus) {if (d.getVegitarian()) {vegetarianDishes.add(d);}}return vegetarianDishes;}
     

    上述方法称为外部迭代,我们显式地管理数据集合上的迭代。

    如何使用Java 8实现这一点?它只是一个单行问题,如下所示。

    Java8写法1

    public static List getVegetarianDishes_new(List menus) {List vegitarianDishes = menus.stream()//找是蔬菜的菜单.filter(d -> d.getVegitarian()).collect(Collectors.toList());return vegitarianDishes;}
     

    我们以Lambda表达式的形式将Predicate实例传递给filter()方法。

    同样,我们可以使用java 8方法引用将Predicate实例传递给filter()方法,如下所示。

    Java8写法2

    List menu = ....
     List vegitarianDishes = menu.stream().filter(Dish::getVegitarian).collect(Collectors.toList());
     

    Dish::getVegitarian是Java 8方法引用的语法。它指的是Dish类的getVegitarian()方法。

    filter()方法返回一个盘子流,collect()方法将这个流转换成一个列表。“收集”操作称为终端操作。

    现在假设,我们想要的前三道菜的热量超过300卡路里。流支持limit(n)方法,它返回不超过给定大小的另一个流。请求的大小作为参数传递给limit。

    List menu = ....
     List threeHighCalaricDish = menu.stream().filter(d -> d.getCalaries() > 300).limit(3).collect(Collectors.toList());
     

    类似地,如果我们想跳过前3个元素,流支持skip(n)方法来返回丢弃前n个元素的流。如果流的元素少于n,则返回一个空流。注意limit(n)和skip(n)是互补的!

    如果使用流来过滤前两道肉类菜肴,如下:

    List menu = ....
     List meatDishes = menu.stream().filter(d -> d.getType() == Dish.Type.MEAT).limit(2).collect(Collectors.toList())
     

    造数以及测试类代码

    package com.liu.filter;import java.util.ArrayList;
     import java.util.List;
     import java.util.stream.Collectors;import com.alibaba.fastjson.JSON;
     import com.liu.filter.Dish.Type;/*** @Decision 测试在Java 8中使用filter()方法 与8之前的方法区别* @author liusx* @Date 2021年8月17日*/
     public class TestFilter {public static void main(String[] args) {List menus = getAllMenus();//java8之前的方法List vegetarianDishes = getVegetarianDishes_old(menus);System.out.println("old方法::"+JSON.toJSONString(vegetarianDishes));//java8之后的方法List vegetarianDishes2 = getVegetarianDishes_new(menus);System.out.println("new方法::"+JSON.toJSONString(vegetarianDishes2));}/*** @decision java8之前方法* @param menus* @return* @author liusx* @Date 2021年8月17日*/public static List getVegetarianDishes_old(List menus) {List vegetarianDishes = new ArrayList();//找是蔬菜的菜单for (Dish d : menus) {if (d.getVegitarian()) {vegetarianDishes.add(d);}}return vegetarianDishes;}/*** @decision java8方法* @param menus* @return* @author liusx* @Date 2021年8月17日*/public static List getVegetarianDishes_new(List menus) {List vegitarianDishes = menus.stream()//找是蔬菜的菜单.filter(d -> d.getVegitarian()).collect(Collectors.toList());return vegitarianDishes;}/*** @decision 造menu数据* @return* @author liusx* @Date 2021年8月17日*/public static List getAllMenus() {List menus = new ArrayList();//所有的菜Dish d1 = new Dish("油麦菜", true, 100, Type.OTHER);Dish d2 = new Dish("青鱼", false, 100, Type.FISH);Dish d3 = new Dish("大鹅", false, 100, Type.MEAT);Dish d4 = new Dish("菠菜", true, 100, Type.OTHER);menus.add(d1);menus.add(d2);menus.add(d3);menus.add(d4);return menus;}}

    测试结果

    在这里插入图片描述

    参考资料链接:

    https://www.javacodegeeks.com/2018/07/filter-method-java-8.html.


    标签:

    上一篇: 图形验证码(ValidateCode) 下一篇:
    素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。