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 通过反射机制得到 ...
随机推荐
- uibutton去掉点击后背景有阴影的方法
1,将normal和highlight两种方式都设置上图片即可 UIButton *goback = [[UIButton alloc]initWithFrame:CGRectMake(5.0f, 5 ...
- 创建es索引-格式化和非格式化
创建es索引-格式化和非格式化 学习了:https://www.imooc.com/video/15768 索引有结构化和非结构化的区分: 1, 先创建索引,然后POST修改mapping 首先创建索 ...
- Hive 外部表 分区表
之前主要研究oracle与mysql,认为hive事实上就是一种数据仓库的框架,也没有太多另类,所以主要精力都在研究hadoop.hbase,sqoop,mahout,近期略微用心看了下hive. ...
- JavaScript - 正则表达式解惑
正则表达式手册: http://tool.oschina.net/uploads/apidocs/jquery/regexp.html 正则表达式测试地址: http://tool.chinaz.co ...
- openERP邮件(发信、收信)
openERP里的邮件处理主要有个2个模块处理 mail -核心 fetchmail -接收邮件 Alias domain和alias name 配置domain alias. Set ...
- 【转载】高性能IO模型浅析
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...
- Node.js 爬虫批量下载美剧 from 人人影视 HR-HDTV
这两天发现了一个叫看知乎的站点.是知乎的苏莉安做的,当中爬虫使用的 Node.js.这里就针对上一篇博客中的美剧小爬虫,改用 nodejs 进行实现一下.体验一下强大的 Node.js. 假设之前没实 ...
- C# Excel批注“哪种开发语言最好”
Excel批注经常使用于为个别的单元格加入凝视.读者可以从凝视中获取额外的信息. 批注可隐藏,仅仅会在单元格右上方显示红色三角.加入后不会对单元格的内容喧宾夺主.在日常编程处理Excel中,为个别单元 ...
- python day - 09 函数
函数 1.函数的定义,引用. 定义:函数是对功能和代码块的封装和定义. 函数用 def关键字来表示. 格式: def 函数名(): 函数体 eg: return(返回值) 在函数中遇到return ...
- sanic官方文档解析之Custom Protocols(自定义协议)和Socket(网络套接字)
1,Custom Protocol:自定义协议 温馨提示:自定义协议是一个高级用法,大多数的读者不需要用到此功能 通过特殊的自定义协议,你可以改变sanic的协议,自定义协议需要继承子类asyncio ...