首页 > 编程语言 >Java8-Consumer的使用场景

Java8-Consumer的使用场景

时间:2023-06-14 14:01:40浏览次数:51  
标签:场景 String void public static Consumer Java8 name

Java8的Consumer比较抽象。结合几个例子来看看常用的使用场景有以下几个:

把方法作为函数的入参

Java8中可以使用Consumer来实现在函数的入参中传递方法,这个如果熟悉js的话可能会比较好理解一些。在某些情况下,不能直接使用某个对象的方法,需要把方法传递到另一个函数里面去执行,那么可以通过入参的形式传递过去,在另一个地方使用对象的方法。

下面通过例子来展示一下具体的使用:
首先定义个实体类Person

public class Person {
    private Integer age;
    private String name;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

然后在PersonTest 中定义实体类Person的执行动作:

public class PersonTest {
    protected Consumer<Person> consumer;

    public PersonTest(Consumer<Person> consumer) {
        this.consumer = consumer;
    }

    public void run() {
        Person person = new Person();
        person.setAge(30);
        person.setName("haha");
        consumer.accept(person);
    }
}

在ConsumerTest 类中定义了readPerson方法来执行Person的动作。readPerson方法作为参数在PersonTest的run()方法里执行了。

public class ConsumerTest {
    public static void main(String[] args) {
        ConsumerTest test = new ConsumerTest();
        new PersonTest(test::readPerson).run();
    }

    private void readPerson(Person person) {
        System.out.println(person.getAge());
        System.out.println(person.getName());
    }
}

作为回调函数

可以很方便的实现回调函数了。

public class ConsumerTest1 {

    private static final Map<String, Integer> map = new HashMap<String, Integer>() {
        {
            put("Tom", 10);
            put("Jerry", 3);
        }
    };

    public static void main(String[] args) {
        //调用方法,同时编写对结果的回调:此处仅仅打印而已
        test("Tom", ConsumerTest1::printName);
    }

    public static void test(String name, Consumer<Integer> consumer) {
        System.out.println("name is " + name);
        consumer.accept(map.get(name));
    }

    public static void printName(Integer age) {
        //业务处理
        System.out.println("age is  " + age);
    }
}

默认方法andThen

andThen 如果一个方法的参数和返回值全都是 Consumer 类型,那么就可以实现效果:消费数据的时候,首先做一个操作, 然后再做一个操作。

public class ConsumerTest2 {
    public static void main(String[] args) {
        Consumer<String> first = (x) -> toLower(x);
        Consumer<String> next = (x) -> toUpper(x);
        first.andThen(next).accept("Hello World");
    }

    private static String toLower(String x) {
        return x.toLowerCase();
    }

    private static String toUpper(String x) {
        return x.toUpperCase();
    }
}

forEach方法

在我们经常使用的forEach方法中底层实现也是Consumer

public class ConsumerTest {
    public static void main(String[] args) {
        List<String> names = new ArrayList<String>() {
            {
                add("Tom");
                add("Jerry");
            }
        };
        names.forEach(e -> System.out.println(e));
        names.forEach(System.out::println);
    }
}

  default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

标签:场景,String,void,public,static,Consumer,Java8,name
From: https://www.cnblogs.com/ByteSpaceX/p/17479997.html

相关文章

  • Java8-Predicate 策略模式的替代品消灭 if else
    使用策略模式消灭ifelse,可以利用Java8的新特性来实现策略模式。利用Java8的Predicate消灭ifelse。首先定义一个map,key是不同的服务代码,value是需要做校验的条件,然后针对不同的服务代码做校验。当然Supplier、Consumer都可以做类似的实现。//定义校验的策略映射关系staticM......
  • Java8-并行流的使用
    Java8中的并行流使用publicclassStreamTest{publicList<Person>constructPersons(){List<Person>persons=newArrayList<Person>();for(inti=0;i<5;i++){Personp=newPerson(i,"name"+......
  • 使用Mybatis生成树形菜单-适用于各种树形场景
    开发中我们难免会遇到各种树形结构展示的场景。比如用户登录系统后菜单的展示,某些大型购物网站商品的分类展示等等,反正开发中会遇到各种树形展示的功能,这些功能大概处理的思路都是一样的,所以本文就总结一下树形结构的代码生成,在开发的时候套用这种结构就可以了。好了正文开始,首先......
  • Java9比Java8改进了什么
    1)引入了模块系统,采用模块化系统的应用程序只需要这些应用程序所需的那部分JDK模块,而非是整个JDK框架了,减少了内存的开销。2)引入了一个新的package:java.net.http,里面提供了对Http访问很好的支持,不仅支持Http1.1而且还支持HTTP2。3)引入了jshell这个交互性工具,让Java也可以像脚本......
  • JAVA8 十大新特性详解
    一、接口的默认方法Java8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法,示例如下:代码如下:interfaceFormula{   doublecalculate(inta);    defaultdoublesqrt(inta){       returnMath.sqrt(a); ......
  • 生成式人工智能在国内金融行业人力资源管理业务中应用场景展望
    随着ChatGPT最近半年受到科技巨头和资本的追捧,其应用场景不断覆盖各个管理业务条线。建投数据作为国内金融行业人力资源管理数字化平台的优质服务商,一直在密切关注生成式人工智能(GenerativeAI)新技术对人力资源管理相关业务带来的影响。德勤2023年全球人力资本趋势报告中提出,“科技......
  • 社交直播语聊场景解决方案(一)商业化探索
    摘要在过去几年的直播行业创业风口期中,直播的用户关注度疯狂增长,但用户质量却参差不齐。随着用户新鲜感一过,流失率变得相当严重,各大平台都在竭尽全力防御。然而,留住“凑热闹”的非直播受众用户并不是最关键的问题,而是要找到适合真实直播受众用户的商业化道路,才能保证行业的稳定繁荣......
  • Java8 Stream List Map:Stream 流对象汇总 求和 某个属性 BigDecimal MDouble
    测试实体(数字对象使用MDouble):importcom.mchweb.common.lang.MDouble;importlombok.*;@Getter@Setter@Builder(toBuilder=true)@NoArgsConstructor@AllArgsConstructorpublicclassUser{privateMDoublemoney;}importcom.mchweb.common.lang.MDouble;imp......
  • AI视觉在教育场景中的创新应用
    正文字数:4312 阅读时长:7分钟本次LiveVideoStackCon2020线下北京峰会我们邀请到了360AI影像事业部总经理张焰老师来做分享,他会为我们带来目前AI视觉在教育中的创新应用,包括课堂专注度、课堂接受度、疲劳提醒、姿态纠正等在线教育场景解决方案。 文/ 张焰整理 /LiveVideoSta......
  • H.265在QRTC场景的落地运用
    近年来,伴随着采集渲染设备终端发展,人们对视频质量的需求也在日益“膨胀”,更高的分辨率:4k/8k,更宽泛的亮度,色度动态范围HDR/Dolby视界,更沉浸式感受:VR/AR360全景体验等;这也给网络带宽/设备计算能力等带来了新的挑战,怎么在有限的容量下传输最有价值的视频信息始终是我们需要解决的核......