Java中Lambda表达式的简单使用
Lambda表达式是Java SE 8中一个重要的新特性。你可以把 Lambda表达式 理解为是一段可以传递的代码 (将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
Lambda运算符:所有的Lambda表达式都是用新的Lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是Lambda的主体。
在平常 我们可以要通过sql 对数据进行过滤、分组、转化等,如果非常频繁,会对数据库增加负担,我们这里就可以简单使用Lambda表达式
1、准备一个Object类
import java.math.BigDecimal; public class AObject { private String a; private String b; private BigDecimal money; private Integer num; public String getA() {
return a;
} public void setA(String a) {
this.a = a;
} public String getB() {
return b;
} public void setB(String b) {
this.b = b;
} public BigDecimal getMoney() {
return money;
} public void setMoney(BigDecimal money) {
this.money = money;
} public Integer getNum() {
return num;
} public void setNum(Integer num) {
this.num = num;
} @Override
public String toString(){
return a+" "+b;
} }
2、Lambda使用
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; public class StreamUtils { public static void main(String args[]){
listToMap();
filter();
// groupingBy();
// sum(); } /**
* List<T> -> Map
* 需要注意的是:
* toMap 如果集合对象有重复的key,会报错Duplicate key ....
* 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
*/
public static void listToMap() {
List<AObject> aList = new ArrayList<>();
AObject aObject = new AObject();
aObject.setA("a");
aObject.setB("B");
AObject aObject1 = new AObject();
aObject1.setA("a1");
aObject1.setB("B1");
aList.add(aObject);
aList.add(aObject1); Map<String, AObject> map = aList.stream().
collect(Collectors.toMap(AObject::getA, AObject->AObject,(k1,k2)->k1));
for(Map.Entry<String, AObject> entry : map.entrySet()){
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue().toString());
}
// key:a1 value:a1 B1
// key:a value:a B Map<String, String> map1 = aList.stream().
collect(Collectors.toMap(AObject::getA, AObject::getB,(k1,k2)->k1));
for(Map.Entry<String, String> entry : map1.entrySet()){
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
}
// key:a1 value:B1
// key:a value:B } /**
* 过滤
*/
public static void filter() {
List<String> aList = new ArrayList<>();
aList.add("1");
aList.add("a");
List<String> slist =aList.stream().filter(e -> "a".equals(e)).collect(Collectors.toList());
System.out.println(slist.toString());// [a] List<AObject> list = new ArrayList<>();
AObject aObject = new AObject();
aObject.setA("110000");
aObject.setB("北京");
AObject aObject2 = new AObject();
aObject2.setA("330000");
aObject2.setB("浙江");
list.add(aObject);
list.add(aObject2);
List<AObject> newList =list.stream().filter(e -> e.getA().equals("110000")).collect(Collectors.toList());
System.out.println(newList.toString());// [110000 北京]
} /**
* 分组
*/
public static void groupingBy(){
List<AObject> list = new ArrayList<>();
AObject aObject = new AObject();
aObject.setA("110000");
aObject.setB("北京");
AObject aObject1 = new AObject();
aObject1.setA("110000");
aObject1.setB("北京1");
AObject aObject2 = new AObject();
aObject2.setA("330000");
aObject2.setB("浙江");
AObject aObject3 = new AObject();
aObject3.setA("330000");
aObject3.setB("浙江1");
list.add(aObject);
list.add(aObject1);
list.add(aObject2);
list.add(aObject3);
//groupingBy 只传key 默认把整个集合关联, 也可以把集合某个数据属性 当做集合取出来,如下groupBy1
Map<String, List<AObject>> groupBy = list.stream().collect(Collectors.groupingBy(AObject::getA));
for(Map.Entry<String, List<AObject>> item : groupBy.entrySet()){
System.out.print(item.getKey()+" : ");
for(AObject a : item.getValue()){
System.out.print(a.toString()+";");
}
System.out.println();
}
//110000 : 110000 北京;110000 北京1;
//330000 : 330000 浙江;330000 浙江1; Map<String, List<String>> groupBy1 = list.stream().collect(
Collectors.groupingBy(AObject::getA, Collectors.mapping(AObject::getB, Collectors.toList())));
for(Map.Entry<String, List<String>> item : groupBy1.entrySet()){
System.out.print(item.getKey()+" : ");
for(String a : item.getValue()){
System.out.print(a+";");
}
System.out.println();
}
// 110000 : 北京;北京1;
// 330000 : 浙江;浙江1;
} /**
* 求和
*/
public static void sum(){
List<AObject> list = new ArrayList<>();
AObject aObject = new AObject();
aObject.setMoney(new BigDecimal("100"));
aObject.setNum(100);
AObject aObject1 = new AObject();
aObject1.setMoney(new BigDecimal("200"));
aObject1.setNum(200);
AObject aObject2 = new AObject();
aObject2.setMoney(new BigDecimal("300"));
aObject2.setNum(300);
AObject aObject3 = new AObject();
aObject3.setMoney(new BigDecimal("400"));
aObject3.setNum(400);
list.add(aObject);
list.add(aObject1);
list.add(aObject2);
list.add(aObject3);
//注意的是 求和的属性 值不能为null
BigDecimal totalMoney = list.stream().map(AObject::getMoney).
reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.println("totalMoney:"+totalMoney); // totalMoney:1000
Integer totalMoney1 = list.stream().map(AObject::getNum).
reduce(0, Integer::sum);
System.out.println("totalSum:"+totalMoney1); // totalSum:1000
int sum = list.stream().mapToInt(AObject::getNum).sum();
System.out.println("sum:"+sum);// sum:1000
} }
Java中Lambda表达式的简单使用的更多相关文章
- Java中Lambda表达式的使用
简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因 ...
- Java中Lambda表达式的使用(转)
https://www.cnblogs.com/franson-2016/p/5593080.html 简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖" ...
- Java中lambda表达式详解
原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...
- 快速掌握Java中Lambda表达式的用法
Lambda表达式的作用: Lambda表达式的作用就是简化代码开发,让代码看起来更加简介.它是用来简化匿名内部类的.但是并不是所有的匿名内部类都能用Lambda表达式简化,Lambda表达式是有使用 ...
- Java中lambda(λ)表达式的语法
举一个排序的例子,我们传入代码来检查一个字符串是否比另一个字符串短.这里要计算: first.length() - second.length() first和second是什么?他们都是字符串.Ja ...
- 为什么Java中lambda表达式不能改变外部变量的值,也不能定义自己的同名的本地变量呢?
作者:blindpirate链接:https://www.zhihu.com/question/361639494/answer/948286842来源:知乎著作权归作者所有.商业转载请联系作者获得授 ...
- Java中Lambda表达式基础及使用详解
概述 Lambda 是JDK 8 的重要新特性.它允许把函数作为一个方法的参数(函数作为参数传递进方法中),使用 Lambda 表达式可以使代码变的更加简洁紧凑,使Java代码更加优雅. 标准格式 三 ...
- Java中lambda表达式学习
一.Lambda表达式的基础语法: Java8中引入了一个新的操作符"->"该操作符称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分为两部分: 左侧:L ...
- Java中Lambda表达式的进化之路
Lambda表达式的进化之路 为什么要使用Lambda表达式 可以简洁代码,提高代码的可读性 可以避免匿名内部类定义过多导致逻辑紊乱 在原先实现接口抽象方法的时候,需要通过定义一个实现接口的外部类来实 ...
随机推荐
- CSS Hack兼容
CSS中有很多标签在不同浏览器中有不同的兼容性问题,问了让网页的功能更好的不同浏览器中显示正常, 需要通过hack的方式来解决浏览器兼容问题. CSS hack问题由来已久,目前我的了解甚少,以下是转 ...
- 避免console错误,console兼容
背景:写js代码时写了很多console.log进行日志打印,最后上生产时不想删除日志输出, 但是ie在不打开控制台时,日志输出会导致后续js不执行,所以需要适时屏蔽js日志输出 (IE等不支持con ...
- Linux服务器性能评估与优化(二)
网络内容总结(感谢原创) 1.Linux内核参数优化 内核参数是用户和系统内核之间交互的一个接口,通过这个接口,用户可以在系统运行的同时动态更新内核配置,而这些内核参数是通过Linux Proc文件系 ...
- sheepdog
- 统计学中的P值与显著性的意义
统计学意义(p值) 结果的统计学意义是结果真实程度(能够代表总体)的一种估计方法.专业上,p值为结果可信程度的一个递减指标,p值越大,我们越不能认为样本中变量的关联是总体中各变量关联的可靠指标.p值是 ...
- 全面了解 NOSQL
NoSQL被我们用得最多的当数key-value存储,想知道为什么要有NOSQL,就首先要明白传统关系SQL: 传统关系数据库的瓶颈 传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简 ...
- win7+jdk1.6+solr4.7.2在内嵌jetty servelt或外置tocmat服务器的solr服务使用
solr安装,目前初步接触solr,了解两种启动方式.一种是自带的jetty,另一种是基于tomcat.由于超过4.7.2版本的solr需要java1.7及以上版本的支持,所以我们选择solr ...
- jboss安全配置规范
https://wenku.baidu.com/view/aad157a4f242336c1fb95ed5.html https://wenku.baidu.com/view/ac227281ec3a ...
- The content of element type "bean" must match "(description?,(constructor-arg|property|lookup-method|replaced-method)*)".
开发中,总有一下奇奇怪怪的问题 完整的错误就不贴了,异常提示: hibernate.xml] is invalid; nested exception is org.xml.sax.SAXParseE ...
- oozie调用java实例------shell action
Oozie提供了一个方便的方式来运行任何命令.这可能是Unix命令,Perl或Python脚本,甚至java程序都可以通过Unix shell调用.shell命令运行在任意的Hadoop集群节点上,并 ...