参考资料: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. Filter和Interceptor的终归作用还是从入口修改或验证请求进来的数据

    Filter是Java EE标准.Inteceptor是Spring 标准. Filter在servlet前面,Interveptor在servlet之后 Filter和Inteceptor都可以改变 ...

  2. linxu下的shell脚本加密,shell生成二机制可执行文件

    再安全的加密也抵不过逆向,斗智斗勇吧,持续加密持续破解 1.简单的加密:gzexe file.sh 2.使用shc加密:下载地址:http://www.datsi.fi.upm.es/~frosal/ ...

  3. 64-bit Itanium与x64

    64-bit Itanium是什么意思 64-bit Itanium,指的是intel 安腾处理器,intel安腾处理器是Intel的某一代处理器,当然是在酷睿(即core)这一代之前出来的. ora ...

  4. BUPT复试专题—Python List(2014)

    题目描述 在Python中,List (列表)是一种非常重要的数据结构.它与C/C++/Java中的 数组有些类似,但支持添加新元素时的动态扩展.在这个问题中,你需要处理如下 的几种对List的操作. ...

  5. photoshop 前端常用技巧

    1.将图片转换成 png 格式 并且 使背景透明 (1)用矩形选框工具选取一块区域 (2)右键 选择 ‘变换选区’ 进行微调 F8 查看尺寸 (3)复制图层(ctrl+c) ->新建文件(ctr ...

  6. 线程池实例:使用Executors和ThreadPoolExecutor

    线程池负责管理工作线程,包含一个等待执行的任务队列.线程池的任务队列是一个Runnable集合,工作线程负责从任务队列中取出并执行Runnable对象. java.util.concurrent.ex ...

  7. 随着ScrollView的滑动,渐渐的运行动画View

    今天是实现了一个小功能的东西.看看效果图: 实现方式: 1.自己定义ScrollView   复写onScrollChange方法,来计算滑动的位置. 2.自己定义接口,通过接口来在ScrollVie ...

  8. 获取连接状态数的awk数组命令

    awk -n|more zhutianpeng@ztp-OptiPlex-:~/Icpp/server$ netstat -n|more 激活Internet连接 (w/o 服务器) Proto Re ...

  9. 让 Logo "飞" 出屏幕

    让 Logo "飞" 出屏幕   推荐序 本文介绍了一种思路,即利用矢量工具来生成动画的关键代码,然后进一步制作成完整的动画效果,感谢作者授权转载. 作者介绍:一缕殇流化隐半边冰霜 ...

  10. Python调用C/Fortran混合的动态链接库--中篇

    接下来,介绍一个简单的例子,从fortran中传递并返回一维自定义结构体数组到python注意点:1.fortran新标准支持可分配数组作为变量传入并在subroutine或function分配后返回 ...