在java之前的版本里,如果希望从集合时查找符合条件的数据,如果先遍历他,这种写法是我们不能接受的,所以现在java有了lambda就很好的解决了这个问题,让代码更优雅一些!

Predicate

  /**
* lambda filter.
* @param list
* @param predicate
* @return
*/
public List<User> conditionFilter(List<User> list, Predicate<User> predicate){
return list.stream().filter(predicate).collect(Collectors.toList());
}

上面的方法里有个predicate委托,他类似C++里的函数指针,和C#里的委托类似,他允许外面将一个表达式传进来,与现有代码很好的结偶了!

 /**
* find list.
*/
public void findList() {
List<User> list = new ArrayList<>();
list.add(new User("zzl"));
list.add(new User("abc"));
list.add(new User("bca"));
list = conditionFilter(list, exe -> exe.getName() == "zzl");
for (User user : list
) {
System.out.println(user.getName()); } }

上面代码在集合里查找了名字为zzl的记录!

下面让委托实现了不等于的查找!

 /**
* lambda filter not.
*
* @param subjects
* @param predicate
* @return
*/
private List<User> conditionFilterNot(List<User> subjects, Predicate<User> predicate) { return subjects.stream().filter(predicate.negate()).collect(Collectors.toList());
}

事实上,java里的Predicate接口还有很多用法,想and,or也有支持!

Consumer

consumer允许外界传入一个有参数但没有返回值的方法原型,这在C#里类似于Action委托,在java里就是函数式接口的一个特例,人家java为咱们封装了一下,开发人员可以直接用这个函数式

接口了,它的原码如下:

@FunctionalInterface
public interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}

我们在平时使用时,比如可以写个日志方法,而日志通过哪种方式持久化我们可能不确定,这时就可以使用Consumer来实现

  private void logger(Consumer<String> action, String msg) {
action.accept(msg);
} @Test
public void lambda() {
logger(i -> System.out.println(i), "hello");
}

在调用传入打印方法时,就把日志打到控制台上,而如果调用方将Slf4j的日志方法传入时,就以这种方法写日志。

 @Test
public void lambdaLog() {
logger(i -> logger.info(i), "hello");
}

参考资料:

http://ifeve.com/predicate-and-consumer-interface-in-java-util-function-package-in-java-8/

https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html

java~lambda表达式让查询更优雅的更多相关文章

  1. Java Lambda表达式入门[转]

    原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示 ...

  2. Java Lambda表达式初探

    Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...

  3. Java Lambda表达式入门

    Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...

  4. Java Lambda表达式教程与示例

    Lambda表达式是Java 8中引入的一个新特性.一个lambda表达式是一个匿名函数,而且这个函数没有名称且不属于任何类.lambda表达式的概念最初是在LISP编程语言中引入的. Java La ...

  5. Java Lambda表达式forEach无法跳出循环的解决思路

    Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...

  6. 「Flink」使用Java lambda表达式实现Flink WordCount

    本篇我们将使用Java语言来实现Flink的单词统计. 代码开发 环境准备 导入Flink 1.9 pom依赖 <dependencies> <dependency> < ...

  7. MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy

    一.序言 众所周知,MybatisPlus在处理单表DAO操作时非常的方便.在处理多表连接连接查询也有优雅的解决方案.今天分享MybatisPlus基于Lambda表达式优雅实现聚合分组查询. 由于视 ...

  8. java lambda表达式学习笔记

    lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...

  9. Java lambda 表达式常用示例

    实体类 package com.lkb.java_lambda.dto; import lombok.Data; /** * @program: java_lambda * @description: ...

随机推荐

  1. javascript && php &&java

    java && javascript && php 轰炸!!!恢复 1.javascript简介 *是基于对象和时间的驱动语言,应用于客户端. -----基于对象: * ...

  2. React 中阻止事件冒泡的问题

    在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...

  3. Boosting(提升方法)之AdaBoost

    集成学习(ensemble learning)通过构建并结合多个个体学习器来完成学习任务,也被称为基于委员会的学习. 集成学习构建多个个体学习器时分两种情况:一种情况是所有的个体学习器都是同一种类型的 ...

  4. WinForm加载外部类库项目的集成开发模式

    在项目开发中有一定的团队用到了Nuget.Coding:但是这用起来还是不太方方便,在Winform中呢,我们可以把一个人的项目当作一个类库项目,因为它生成的是一个dll文件,也就是单一文件,拥有了它 ...

  5. .net core 并发下的线程安全问题

    抱歉,其实内容并不如题!!!真正的题目应该为<.net core 并发下由于注入模式引起的线程安全问题> 背景(写测试demo所出现的异常,供大家学习与拍砖): .net core web ...

  6. 微信小程序之表单验证

    表单验证 何为表单验证呢? 百度百科给出的回答是这样的: 表单验证是javascript中的高级选项之一.JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证 [ ...

  7. 学习 javascript (一)javascript 简介

    javascript 从一个简单的输入验证器发展成为一门强大的编程语言. 历史 以前我们输入一个表单,点击完提交后,服务器发送反馈给我们.比如填写姓名的时候,我们在前端不能限定人们只能输入汉字,需要服 ...

  8. jQuery拼图小游戏

    jQuery拼图小游戏 最后样式 核心代码部分 <script type="text/javascript" > $(function () { $("td& ...

  9. SpringBoot启动原理分析

    用了差不多两年的SpringBoot了,可以说对SpringBoot已经很熟了,但是仔细一想SpringBoot的启动流程,还是让自己有点懵逼,不得不说是自己工作和学习的失误,所以以此文对Spring ...

  10. ERP小金刚Pro专业大比拼: Dynamics,NetSuite和Odoo

    前言 在过去的15年中,新技术推动了大大小企业的重新思考他们的流程管理涉及不断变化的业务所创造的新动态景观.实施ERP是许多企业为帮助组织而采取的措施并优化他们开展业务的方式.然而,市场上目前有许多商 ...