参考资料:https://www.dotnetperls.com/lambda-java

Lambdas用于创建函数对象。通过它们,我们可以在其它方法内部指定方法,甚至可以把方法做为参数传递给其它方法。Lambda需要有固定的定义,用以决定它的输入参数和返回值,例如Supplier、Consumer、Function、Predicate和UnaryOperator的定义。
以下为java.util.function包的几个类学习

环境:jdk1.8.0_144

1. java.util.function.Supplier

/**
* 返回一个<T>类型的结果
*/
@FunctionalInterface
public interface Supplier<T> { /**
* 获取结果
*/
T get();
}

应用举例:

public class TestSupplier {
private Supplier<Integer> supplier = new Supplier<Integer>() {
@Override
public Integer get() {
return 100;
}
};
private Supplier<Integer> supplierLambda = () -> 100; public int execute() {
return execute(supplier);
} public int executeLambda() {
return execute(supplierLambda);
} private int execute(Supplier<Integer> supplier) {
return supplier.get();
}
}

2. java.util.function.Consumer

/**
* 接收<T>类型的参数,无返回
*/
@FunctionalInterface
public interface Consumer<T> { /**
* 基于输入参数执行操作
*/
void accept(T t); /**
* 返回按顺序执行的{@code Consumer}。任意操作的异常都会传播到调用者,若当前操作抛出异常,{@code after}操作将不执行
*/
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}

应用举例:

public class TestConsumer {
private int consumerRtn;
private int consumerLambdaRtn;
private Consumer<Integer> consumer = new Consumer<Integer>() {
@Override
public void accept(Integer t) {
consumerRtn = t + 1;
}
};
private Consumer<Integer> consumerLambda = t -> consumerLambdaRtn = t; public int execute(int input) {
execute(consumer, input);
return consumerRtn;
} public int executeLambda(int input) {
execute(consumerLambda, input);
return consumerLambdaRtn;
} private void execute(Consumer<Integer> consumer, int input) {
consumer.accept(input);
}
}

3. java.util.function.Function

/**
* 接收一个<T>类型参数,并返回<R>类型参数
*/
@FunctionalInterface
public interface Function<T, R> { /**
* 基于输入参数执行操作,并返回值
*/
R apply(T t); default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
} default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
} static <T> Function<T, T> identity() {
return t -> t;
}
}

应用举例:

public class TestFunction {
private Function<String, Integer> function = new Function<String, Integer>() {
@Override
public Integer apply(String t) {
return Integer.parseInt(t);
}
};
private Function<String, Integer> functionLambda = Integer::parseInt; public int execute(String input) {
return execute(function, input);
} public int executeLambda(String input) {
return execute(functionLambda, input);
} private int execute(Function<String, Integer> function, String input) {
return function.apply(input);
}
}

4. java.util.function.Predicate

/**
* 单参数的断言
*/
@FunctionalInterface
public interface Predicate<T> { /**
* 基于输入参数求断言的值并返回
*/
boolean test(T t); default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
} default Predicate<T> negate() {
return (t) -> !test(t);
} default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
} static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}

应用举例:

public class TestPredicate {
private Predicate<Integer> predicate = new Predicate<Integer>() {
@Override
public boolean test(Integer t) {
return t > 100;
}
};
private Predicate<Integer> predicateLambda = t -> t > 100; public void execute(List<Integer> list) {
execute(predicate, list);
} public void executeLambda(List<Integer> list) {
execute(predicateLambda, list);
} private void execute(Predicate<Integer> predicate, List<Integer> list) {
list.removeIf(predicate);
}
}

5. java.util.function.UnaryOperator

/**
* 输入输出为同一类型的特殊Function
*/
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> { /**
* Returns a unary operator that always returns its input argument.
*
* @param <T> the type of the input and output of the operator
* @return a unary operator that always returns its input argument
*/
static <T> UnaryOperator<T> identity() {
return t -> t;
}
}

应用举例:

public class TestUnaryOperator {
private UnaryOperator<Integer> unaryOperator = new UnaryOperator<Integer>() {
@Override
public Integer apply(Integer t) {
return t + 100;
}
};
private UnaryOperator<Integer> unaryOperatorLambda = t -> t + 100; public void execute(List<Integer> list) {
execute(unaryOperator, list);
} public void executeLambda(List<Integer> list) {
execute(unaryOperatorLambda, list);
} private void execute(UnaryOperator<Integer> unaryOperator, List<Integer> list) {
list.replaceAll(unaryOperator);
}
}

Java 8的Lambda学习的更多相关文章

  1. java 8 中lambda表达式学习

    转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-o ...

  2. Java 8里面lambda的最佳实践

    Java 8已经推出一段时间了,越来越多开发人员选择升级JDK,这条热门动弹里面看出,JDK7最多,其次是6和8,这是好事! 在8 里面Lambda是最火的主题,不仅仅是因为语法的改变,更重要的是带来 ...

  3. JAVA基础知识|lambda与stream

    lambda与stream是java8中比较重要两个新特性,lambda表达式采用一种简洁的语法定义代码块,允许我们将行为传递到函数中.之前我们想将行为传递到函数中,仅有的选择是使用匿名内部类,现在我 ...

  4. 理解和运用Java中的Lambda

    前提 回想一下,JDK8是2014年发布正式版的,到现在为(2020-02-08)止已经过去了5年多.JDK8引入的两个比较强大的新特性是Lambda表达式(下文的Lambda特指JDK提供的Lamb ...

  5. Java 8中Lambda表达式默认方法的模板方法模式,你够了解么?

    为了以更简单的术语描述模板方法,考虑这个场景:假设在一个工作流系统中,为了完成任务,有4个任务必须以给定的执行顺序执行.在这4个任务中,不同工作流系统的实现可以根据自身情况自定义任务的执行内容. 模板 ...

  6. 【Java线程池快速学习教程】

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  7. java concurrent包的学习(转)

    java concurrent包的学习(转) http://my.oschina.net/adwangxiao/blog/110188 我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常 ...

  8. java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码

    java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定 ...

  9. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

随机推荐

  1. 【Linux】在虚拟机上安装ubuntu

    虚拟机安装步骤  参考:http://www.cnblogs.com/sxdcgaq8080/p/7466529.html 在安装ubuntu系统之前,当然是下载一个ubuntu的iso镜像在本地啦. ...

  2. 第二讲_图像数据处理Image Data Processing

    第二讲_图像数据处理Image Data Processing 深度模型出现后被弱化,但是思想的影子在深度模型中可以看到的 图片存储原理 RGB颜色空间:三通道(b,g,r),加法混色 CMY(K): ...

  3. webrtc初探

    0.闲来无事,想研究webrtc,看了一些网上的文章之后,觉得谬误较多,以讹传讹的比较多,自己试验了一把,记录一下. 官网的写的教程在实践中也觉得不用那么复杂,有种落伍与繁冗的感觉. 1.我想看的是w ...

  4. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

  5. hunnu--11545--小明的烦恼——找路径

    小明的烦恼--找路径  Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:32768KB Total submit users:  ...

  6. Oracle核心技术 笔记(该书读得不细致,须要找时间再细读~~)

    Oracle核心技术 跳转至: 导航. 搜索 文件夹 1 開始 2 redo和undo 3 事务与一致性 4 锁与闩 5 缓存和复制 6 写入和恢复 7 解析与优化 8 RAC及'缺陷' 9 附录A ...

  7. c# 扩展方法奇思妙用基础篇五:Dictionary<TKey, TValue> 扩展

    Dictionary<TKey, TValue>类是常用的一个基础类,但用起来有时确不是很方便.本文逐一讨论,并使用扩展方法解决. 向字典中添加键和值 添加键和值使用 Add 方法,但很多 ...

  8. block-循环引用

    在ARC机制下,app的内存管理由操作系统进行管理,不须要程序猿手动的管理内存,方便了开发.虽然,自己主动释放内存非常方便.可是并不是绝对安全,绝对不会产生内存泄露. 大部分导致iOS对象无法按预期释 ...

  9. python day- 6 is 和 ==的区别 encode 和 decode

    1.is 和  == 的区别. == 是由来判断左右两边的内容是否相等. is 是用来判断内存地址是否相同. 引进 id (   )函数 小数据池: 对于字符串 ,数字 ,bool 值进行 id()计 ...

  10. springCloud和docker笔记(1)——微服务架构概述

    1.微服务设计原则 1)单一职责原则:只关注整个系统中单独.有界限的一部分(SOLID原则之一) 2)服务自治原则:具备独立的业务能力和运行环境,可独立开发.测试.构建.部署 3)轻量级通信机制:体量 ...