参考资料: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. 【RESTful】1.理解REST和RESTful

    简记:一套设计良好的RESTful可以帮助互联网产品支持[单个服务端+多个客户端]的场景!!!

  2. Mysql 性能优化20个原则(2)

    5. 在Join表的时候使用相当类型的例,并将其索引 如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的.这样,MySQL内部会启动为你优化Join的SQL语句的机 ...

  3. 【Android开发—智能家居系列】(四):UDP通信发送指令

    思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指 ...

  4. BUPT复试专题—串查找(?)

    https://www.nowcoder.com/practice/a988eda518f242c29009f8620f654ede?tpId=67&tqId=29642&rp=0&a ...

  5. 转: 在CentOS 6.X 上面安装 Python 2.7.X

    转:https://ruiaylin.github.io/2014/12/12/python%20update/ 评注: yum -y update //这个更新太坑了,1120更新包...想死的心都 ...

  6. mysql中游标在存储过程中的具体使用方法

    昨天写的一个东东,分享下给大家. drop PROCEDURE  if exists sp_cleanUserData; CREATE  PROCEDURE `sp_cleanUserData`()  ...

  7. 面向接口的webservice发布方式

    import javax.jws.WebService; /**面向接口的webservice发布方式 */ @WebService public interface JobService { pub ...

  8. javascript Array method总结

    0.创建 Javascript创建数组的基本方式有两种.第一种是使用Array构造函数. var colors = new Array(); var colors = new Array(20); v ...

  9. [leetcode] database解题记录

    175 Combine Two Tables 题目:左连接Person表和Address表. select FirstName,LastName,City,State from Person p le ...

  10. eclipse通过maven建立java se工程配置log4j,打包成zip,将jar包和配置文件分开,并以bat和sh文件启动java程序

    一.新建maven的java工程 1.eclipse里file-new-other,选择maven Project 2.选中 Use default Workspace location,然后 nex ...