java8函数式接口,以及stream流中map、peek、foreach区别

news/2024/9/25 10:57:20/

java8_0">java8常用函数式接口

java">import java.util.function.Supplier;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
  • Supplier
java">@FunctionalInterface
public interface Supplier<T> {T get(); // 无参,有返
}
  • Consumer
java">@FunctionalInterface
public interface Consumer<T> {void accept(T t);   // 有参,无返// 默认方法
}
  • Function
java">@FunctionalInterface
public interface Function<T, R> {R apply(T t);  // 有参,有返// 默认方法、static方法
}
  • BiConsumer
java">@FunctionalInterface
public interface BiConsumer<T, U> {void accept(T t, U u);// 默认方法
}
  • BiFunction
java">@FunctionalInterface
public interface BiFunction<T, U, R> {R apply(T t, U u);// 默认方法
}
  • Predicate
java">@FunctionalInterface
public interface Predicate<T> {boolean test(T t);// 默认方法
}

// Bi开头的,BiConsumer和 BiFunction,都至少接受两个参数。而Consumer和 Function都是一个参数。

java8stream_API_64">java8常用stream API

  • filter

stream().filter(Predicate p); 要求传入 Predicate,有参数,且返回布尔值,并生成原类型的stream流。

  • map

stream().map(Function mapper); 要求传入Function, 有参数,有返回值。 map会对每一个元素映射为另一个返回值,并生成新类型的stream流。

  • peek

stream().peek(Consumer action); 要求传入Consumer,有参数,无返回值。 peek会操作每一个元素,但返回原来的流。

  • forEach

stream().forEach(Consumer action);要求传入Consumer,有参数,无返回值。但forEach不再返回流了,是一个流结束函数。

  • collect

stream().collect(); 有两个重载方法参数列表,都不再返回流,而是返回某种集合类型。

java">    <R> R collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner);<R, A> R collect(Collector collector); // Collector接口中,也规范了supplier(),accumulator(),combiner()方法,本质和上面差不多
  • toMap

stream().collect(Collectors.toMap());
Collectors.toMap(), 有三个重载方法参数列表

java">// 两个Function类型参数 key,value, 实际上是去调用另一个重载方法,throwingMerger():当key相同时,会抛出异常;
Collector toMap(Function keyMapper, Function valueMapper) {return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}
// 两个Function类型参数 key,value + 一个父类为BiFunction的mergeFunction,BiFunction接收两个参数,聚合后一个返回值:当key相同时,如何合并。
Collector toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction) {return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}
// 实际上他们都是调用四个参数的重载方法,对传入的mergeFunction,也是使用java.util.Map中的merge方法来合并
Collector toMap(Function keyMapper,Function valueMapper,BinaryOperator mergeFunction,Supplier<M> mapSupplier) {BiConsumer accumulator = (map, element) -> map.merge(keyMapper.apply(element),  valueMapper.apply(element), mergeFunction);return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}
  • 其他stream流常用API
    stream().distinct()
    stream().count()
    stream().sorted()
    stream().findFirst()
    stream().findAny()
    stream().anyMatch()
    stream().allMatch()
    stream().noneMatch()
    stream().max()
    stream().min()
    .stream().toArray(IntFunction<A[]> generator) // 返回指定类型的数组 A[] toArray(IntFunction<A[]> generator)

Optional中filter、map、ifPresent

  • map
Optional.ofNullable(customer).map(Function mapper)

在Optional中,map也是要求传入Function,有参数,有返回值,map返回一个新类型的Optional,

  • filter
Optional.ofNullable(customer).filter(Predicate p)

filter也是要求传入 Predicate,有参数,且返回布尔值,返回原类型的Optional,

  • ifPresent
Optional.ofNullable(customer).ifPresent(Consumer action);

而ifPresent与forEach类似,要求传入Consumer,有参数,无返回值,且结束后不再返回Optional,结束这个Optional。

Runnable、Closeable 也是函数式接口

(无参数,无返回值)

  • Runnable
java">@FunctionalInterface
public interface Runnable {public abstract void run();
}
  • Closeable
java">public interface Closeable extends AutoCloseable {public void close() throws IOException;
}

匿名内部类

在不熟悉Runnable、Function、Consumer、BiFunction、BiConsumer区别时,可以new Runnable()并按提示生成匿名内部类
例如:

java"> new Thread(new Runnable() {@Overridepublic void run() {System.out.println("hello word!");}
});

再按提示转成lambda,但明确这几项函数式接口的参数和返回值后,可以直接写lambda

直接写lambda表达式

  • Runnable: 无参数,无返回值。直接写出lambda:
java">  ()->{System.out.println("hello word!");} 

方法体只有一行省略掉大括号:()->System.out.println(“hello word!”)

  • Predicate:有参数,需要返回值(布尔)。直接写出lambda:
java">  (e)->{return e.getId() > 0;}

参数只有一个可以省略括号,方法体加返回只有一行又可以省略大括号和return关键字:e-> e.getId() > 0

  • Function:有参数,有返回值。直接写出lambda:
java">  (e)->{return e.getId();}

参数只有一个可以省略括号,方法体加返回只有一行又可以省略大括号和return关键字:e->e.getId()

e是上一步函数的返回值作为当前函数参数,又可省略到参数声明,方法引用:Customer::getId

  • Consumer:有参数,无返回值。直接写出lambda:
java">  (e)->{system.out.println(e);}

参数只有一个可以省略括号,但方法体只有一行又可以省略大括号:e->System.out.println(e)

e是上一步函数的返回值作为当前函数参数并又作为参数传入sout,又可省略到参数声明,方法引用:System.out::println

  • BiConsumer:有两个参数,无返回值。直接写出lambda:
java">  (k1, k2)->{System.out.println(k1 + k2);}

参数大于1不能省略小括号,但方法体只有一行又可以省略大括号:(k1, k2)->System.out.println(k1 + k2)

  • BiFunction:有两个参数,有返回值。直接写出lambda:
java">  (k1, k2)->{return k1 + k2;}

参数大于1不能省略小括号,但方法体加返回只有一行又可以省略大括号和return关键字:(k1, k2)->k1 + k2


http://www.ppmy.cn/news/1502130.html

相关文章

RK3588+MIPI+GMSL+AI摄像机:自动车载4/8通道GMSL采集/边缘计算盒解决方案

RK3588作为目前市面能买到的最强国产SOC&#xff0c;有强大的硬件配置。在智能汽车飞速发展&#xff0c;对图像数据矿场要求越来越多的环境下&#xff0c;如何高效采集数据&#xff0c;或者运行AI应用&#xff0c;成为刚需。 推出的4/8通道GMSL采集/边缘计算盒产品满足这些需求…

docker compose 安装 kafka

一 前置准备 创建 /data/kafkadata /data/zookeeper-1用于保存kafka和zookeeper的配置文件 kafkadata中创建三个文件夹 /kafka1 /kafka2 /kafka3&#xff0c;用于存放三个kafka节点的配置文件 zookeeper-1文件夹中创建 /conf /data /logs /datalog四个文件夹&#xff0c;用于…

【Linux从青铜到王者】tcp协议2

滑动窗口 滑动窗口是什么 上篇提到如果两端发送数据如果是一发一收那就是串行&#xff0c;效率很低&#xff0c;所以可以一次发送多个报文&#xff0c;一次也可以接受多个报文&#xff0c;可以大大的提高性能(其实是将多个段的等待时间重叠在一起了&#xff09; 那么是怎么发…

打造一篇完美的【数学建模竞赛论文】:从准备到撰写的全面指南

目录 一、赛前准备 1.1 报名与纪律要求 1.2 MD5码上传 1.3 竞赛准备 1.4 时间分配 二、论文格式规范 2.1 摘要 2.2 参考文献 2.3 排版要求 三、建模过程与方法 3.1 问题分析与模型假设 3.2 模型构建与求解 3.3 结果分析与检验 四、论文撰写技巧 4.1 论文结构 4…

opencascade AIS_InteractiveObject源码学习【重中之重】

AIS_InteractiveObject 前言 //! 定义一个具有显示和选择服务的对象类。 //! 被可视化和选择的实体是交互式对象。 //! 实体的特定属性&#xff0c;如尺寸中箭头的外观&#xff0c;必须在 Prs3d_Drawer 中加载。 //! //! 您可以利用已经编写好所有必要方法的标准交互式对象类&…

项目实战_表白墙(简易版)

你能学到什么 一个比较简单的项目&#xff1a;表白墙&#xff08;简易版&#xff09;&#xff0c;浏览器&#xff1a;谷歌升级版将在下个博客发布 效果如下 正文 说明 我们是从0开始一步一步做这个项目的&#xff0c;里面的各种问题&#xff0c;我也会以第一人称视角来解…

【JAVA】记录一次前端无能造成的 线上bug

有一个需求是 当方式切换 垫资时 清空 当前所选细单商品 但是前端的奇葩 操作是&#xff0c;只是在页面上清空 细单。 不请求 后台删除 细单 让前端 必须 清空同时 请求后台 删除细单 但是 该前端 技术不行&#xff0c; 嫌麻烦 不做 只好 后台 判断该类型时 进行删除操作…

【Git】Git小项目模型梳理

事情的起因是笔者正在做的项目&#xff0c;是一个小团队&#xff0c;团队成员不到5人&#xff0c;且项目处于第一个生产版本的创建过程中&#xff0c;为没有合适的Git模型而犹豫了很久&#xff0c;最终确定的模型和最初的也有不同。特此记录&#xff0c;主要是为了个人总结&…