当前位置: 首页 > news >正文

Java的Lambda表达式学习笔记:使用lambda表达式

跟着官网的教程一起深入学习Lambda表达式:

Using Lambdas Expressions in Your Application - Dev.java

二、运用Lambda表达式到程序中

JDK8加了一个新包java.util.function,里面定义了很多函数式接口,主要分为4类:Supplier<T>、

Consumer<T>、Predicate<T>、Function<T, R>

1.想获取一个新对象使用Supplier<T>

Supplier没有入参,会返回一个对象,而且每次调用都会返回一个新的对象

@FunctionalInterface
public interface Supplier<T> {

    T get();
}

下面是一个简单的Supplier实现如下:

public static void main(String[] args) {
    Supplier<String> str = () -> "hello Duke";
    System.out.println(str.get());
}

 再看一个实现示例:

public static void main(String[] args) {
    Random random = new Random(314L);
    Supplier<Integer> supplier = () -> random.nextInt(10);
    for (int i = 0; i < 5; i++) {
        System.out.println(supplier.get());
    }
}

上面的操作会两次装箱和拆箱操作,一个是random.nextInt(10)返回int时会自动装箱为Integer;另一个是调用get后获得随机数后(这里我自己也不是很懂,有人懂的赐教一下),这样的自动装箱拆箱会影响性能。考虑到这个问题,JDK提供了优化的方法供使用。比如提供了专门的IntSupplier<T>:

@FunctionalInterface
public interface IntSupplier {

    int getAsInt();
}

用IntSupplier修改上面的例子:

Random random = new Random(314L);
IntSupplier newRandom = () -> random.nextInt();


for (int i = 0; i < 5; i++) {
    int nextRandom = newRandom.getAsInt();
    System.out.println("next random = " + nextRandom);
}

JDK提供了四个这样的专用Supplier:IntSupplier, BooleanSupplier, LongSupplier, DoubleSupplier.其中的get方法分别为getAsInt(),getAsBoolean(),getAsLong(),getAsDouble()

2.需要使用一个对象用Consumer<T>

 Consumer和Supplier相反,它需要入参,但不返回东西,而且它除了抽象方法还有一个default方法

@FunctionalInterface
public interface Consumer<T> {

    void accept(T t);

    // default methods removed
}

在Supplier的例子中使用Consumer:

public static void main(String[] args) {
    Random random = new Random(314L);
    IntSupplier supplier = () -> random.nextInt(10);
    Consumer<Integer> consumer = s -> System.out.println(s);

    for (int i = 0; i < 5; i++) {
        consumer.accept(supplier.getAsInt());
    }
}

Consumer和Supplier一样,考虑到性能优化,提供了专门的IntConsumer,LongConsumer,DoubleConsumer,因为它们都没有返回值,方法均为accept()。

JDK还提供了一个接收两个参数的BigConsumer<T, U>

@FunctionalInterface
public interface BiConsumer<T, U> {

    void accept(T t, U u);

    // default methods removed
}

使用BigConsumer重写写获取随机数的例子:

public static void main(String[] args) {
    BiConsumer<Random, Integer> consumer = (r, n) -> {
        for (int j = 0; j < n; j++) {
            System.out.println(r.nextInt(10));
        }
    };

    consumer.accept(new Random(314L), 5);
}

 BigConsumer也提供了专门的ObjIntConsumer,ObjLongConsumer,ObjDoubleConsumer

 3.当需要判断一个对象是否满足某个条件时用Predicate<T>

predicate常常会被用来做过滤

@FunctionalInterface
public interface Predicate<T> {

    boolean test(T t);

    // default and static methods removed
}

Predicate的基本类型专用接口有IntPredicate,LongPredicate,DoublePredicate,同时也有支持两个入参的接口BigPredicate<T, U>,但是BigPredicate没有基本类型的专用接口。

用Predicate对list做过滤:

public static void main(String[] args) {
    List<String> list = List.of("one", "two", "three", "four", "five");
    List<String> strings = new ArrayList<>(list);
    Predicate<String> predicate = s -> s.length()%2==0;

    strings.removeIf(predicate);
    System.out.println(strings);
}

输出如下:

注意这里的removeIf()会修改调用列表的内容,所以像List.of()和Arrays.asList()生成的list,调用removeIf()时会运行保存,因为这两种方式生成的列表都是不可变的。

 

相关文章:

  • 2022-09-02
  • 14天刷爆LeetCode算法学习计划——Day05 快慢指针(2)
  • Redis进阶
  • 双软认定流程?
  • 淘宝如何选词打造黄金标题?构词规则是什么?
  • 跨境运营培训品牌商店设计技巧
  • 双软企业认证与税收优惠政策讲解(比较齐全)
  • Java处理Excel表格的读取和写入
  • MySQL之临时表
  • 氨丙基咪唑离子液体(AMIBr)改性纤维素气凝胶吸附剂(CAgAMIBr)的实验要求
  • Go 命名规范
  • 容灾演练月报 | 雅安市商业银行四大业务系统完成容灾切换演练
  • STM32CubeIDE实现printf重定向输出到串口
  • 解决:知乎中导入的md格式文档,公式不能居中,即使加了\\后也不能居中
  • js小数点后面不足4位数补0
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 2017-08-04 前端日报
  • Angular数据绑定机制
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • gops —— Go 程序诊断分析工具
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • HTTP那些事
  • java中的hashCode
  • k8s 面向应用开发者的基础命令
  • MySQL的数据类型
  • Python_OOP
  • Spring Boot快速入门(一):Hello Spring Boot
  • 编写高质量JavaScript代码之并发
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 解析 Webpack中import、require、按需加载的执行过程
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #HarmonyOS:Web组件的使用
  • (5)STL算法之复制
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (TOJ2804)Even? Odd?
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (十八)三元表达式和列表解析
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Core引入性能分析引导优化
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET和.COM和.CN域名区别
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • @Transactional 竟也能解决分布式事务?
  • [ JavaScript ] JSON方法
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步