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表达式 可以简洁代码,提高代码的可读性 可以避免匿名内部类定义过多导致逻辑紊乱 在原先实现接口抽象方法的时候,需要通过定义一个实现接口的外部类来实 ...
随机推荐
- BZOJ2535: [Noi2010]Plane 航空管制2(拓扑排序 贪心)
题意 题目链接 Sol 非常妙的一道题. 首先不难想到拓扑排序,但是直接对原图按\(k\)从小到大拓扑排序是错的.因为当前的\(k\)大并不意味着后面的点\(k\)也大 但是在反图上按\(k\)从大到 ...
- Ubuntu16.04安装Hadoop2.6+Spark1.6+开发实例
Ubuntu16.04安装Hadoop2.6+Spark1.6,并安装python开发工具Jupyter notebook,通过pyspark测试一个实例,調通整个Spark+hadoop伪分布式开发 ...
- Linux漏洞分析入门笔记-CVE-2015-0235
Ubuntu 12.04 32位 ida 7.0 0x00:漏洞描述 1.glibc的__nss_hostname_digits_dots存在缓冲区溢出漏洞,导致使用gethostbyname系列函数 ...
- 【Linux】chmod命令
格式chmod 权限 要修改权限的文件linux中的权限如下: -rw------- (600) -- 只有属主有读写权限. -rw-r--r-- (644) -- 只有属主有读写权限:而属组用户和其 ...
- Android.mk添加第三方jar包
最近引入第三方的jar包进工程,发现光红色的两条并不起作用,加入include $(BUILD_MULTI_PREBUILT) 才起作用,而且顺序很重要,在这里把我参考的两个例子都列出来. 以下为引用 ...
- Django初步(一):安装和简单演示
参考:Windows下安装Django:http://www.th7.cn/Program/Python/201305/136301.shtml
- C# 取整问题
关于C#里的取整问题,有向上和向下两种取整方式[1]向上取整a=1.2345string res = Math.Ceiling(Convert.ToDecimal(a)).ToString();str ...
- JavaScript获取当前网页的源码
通过 outerHTML document.documentElement.outerHTML 通过异步请求 $.get(window.location.href,function(res){ con ...
- apache ab 测试 apr_socket_connect(): 由于目标机器积极拒绝 无法连接
遇到这种情况一般是你开的并行数量太多了...例如:ab -c 1000 -n 10000 http://localhost/index.html 如此大的请求就会挂掉,不过还是有补救措施的,可以通过增 ...
- Scrum _GoodJob
作为长大的大三老腊肉,我们已经在长大生活了两年多,对于什么是长大人最想完善的校园需求.最想拥有的校园服务媒介也有了更加深切的体会. 于是,GoodJob小团队blingbling闪现啦!! GoodJ ...