Java 8的Lambda学习
参考资料: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学习的更多相关文章
- java 8 中lambda表达式学习
转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-o ...
- Java 8里面lambda的最佳实践
Java 8已经推出一段时间了,越来越多开发人员选择升级JDK,这条热门动弹里面看出,JDK7最多,其次是6和8,这是好事! 在8 里面Lambda是最火的主题,不仅仅是因为语法的改变,更重要的是带来 ...
- JAVA基础知识|lambda与stream
lambda与stream是java8中比较重要两个新特性,lambda表达式采用一种简洁的语法定义代码块,允许我们将行为传递到函数中.之前我们想将行为传递到函数中,仅有的选择是使用匿名内部类,现在我 ...
- 理解和运用Java中的Lambda
前提 回想一下,JDK8是2014年发布正式版的,到现在为(2020-02-08)止已经过去了5年多.JDK8引入的两个比较强大的新特性是Lambda表达式(下文的Lambda特指JDK提供的Lamb ...
- Java 8中Lambda表达式默认方法的模板方法模式,你够了解么?
为了以更简单的术语描述模板方法,考虑这个场景:假设在一个工作流系统中,为了完成任务,有4个任务必须以给定的执行顺序执行.在这4个任务中,不同工作流系统的实现可以根据自身情况自定义任务的执行内容. 模板 ...
- 【Java线程池快速学习教程】
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- java concurrent包的学习(转)
java concurrent包的学习(转) http://my.oschina.net/adwangxiao/blog/110188 我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常 ...
- java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码
java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
随机推荐
- Mac装Win10后没有无线网络的处理
在“文件资源管理器”中找到“此电脑”,打开,看到“设备与驱动管理器”,找到Bootcamp文件夹,点击进入,运行setup,之后重启就好了.
- Intel graphics processing units
http://en.wikipedia.org/wiki/Comparison_of_Intel_graphics_processing_units Comparison of Intel graph ...
- 设计模式入门之訪问者模式Visitor
//訪问者模式定义:表示一个作用于某对象结构中的各个元素的操作,它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. //从定义上看.这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一 ...
- linux PC手把手搭建minigui3.0开发环境
1.下载网址http://www.minigui.com/en/download/ 2.下载资料: 3.安装过程: (1)安装 libminigui-gpl-3.0.12.tar.gz tar zxv ...
- 基础才是重中之重~用好configSections让配置信息更规范
对于小型项目来说,配置信息可以通过appSettings进行配置,而如果配置信息太多,appSettings显得有些乱,而且在开发人员调用时,也不够友好,节点名称很容易写错,这时,我们有几种解决方案 ...
- WM_GETMINMAXINFO的作用 .
如果想要实现窗口全屏,并且还有状态栏,会出现问题,那就是OnGetMinMaxInfo函数的作用.你可以试一下,如果把这个函数去掉,则当你按下工具栏中的全屏显示按钮时,框架视图确实变大了,但没有想象的 ...
- xamarin.android Activity之间跳转与传值
前言 由于需要,所以接触到这个新的安卓开发模式,我会把我的学习经历全都记录下来,希望对大家有用. 导读 关于Activity,学习过安卓的人也应该明白什么是Activity,推荐新手去看YZF的这篇文 ...
- this that 时间戳转日期 小程序 列表 与 加载
var gd = getApp().globalData; var imgUrlApp = gd.imgUrlApp; var localImgPath = gd.localImgPath; var ...
- 通达OA二次开发 工作流表单中关联查询另外一个工作流方法(源代码)
一个工作流表单中,怎样方便的查询相关的工作流表单内容.重复打开各个菜单必定须要造成多次点击浪费时间,切换也会带来思路的中断.这里通过js代码的方式把这个问题进行了解决. <style>&l ...
- babel的安装和使用方法
要使用Babel, 我们需要nodeJS的环境和npm, 主要安装了nodeJS, npm就默认安装了 , 现在安装nodeJS很简单了, 直接下载安装就好了: 安装es-checker 在使用Bab ...