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表达式 可以简洁代码,提高代码的可读性 可以避免匿名内部类定义过多导致逻辑紊乱 在原先实现接口抽象方法的时候,需要通过定义一个实现接口的外部类来实 ...
随机推荐
- nodejs进阶(7)—async异步流程控制
Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 m ...
- 编写可维护的 Gruntfile.js
load-grunt-tasks 插件 首先介绍下 load-grunt-tasks 这个插件. 我们一般都会把所有用到的插件以及插件的配置写到 Gruntfile.js 里面,对于小项目来说这个文件 ...
- 细说CSV
CSV全称是Comma-Separated Values(逗号分隔值).作为一种数据传输与存储的格式,它显然没有xml,json强大,只能进行一些二维数组的数据处理,但它在项目还是经常 ...
- jquery控制滚动条
$(function () { $("table tr td a").css('white-space', 'nowrap'); $("div[id$=ctlScroll ...
- 自整定模糊PID算法的理论
模糊控制系统的构成与与常规的反馈控制系统的主要区别在于控制器主要是由模糊化,模糊推理机和精确化三个功能模块和知识库(包括数据库和规则库)构成的.具体实现过程如下所示: (1)预处理: 输入数据往往是通 ...
- 2016微软技术大会Azure相关回顾
3 天的时间稍纵即逝,伴随着本届大会压轴大奖的揭晓,2016 年度的微软技术大会完美落幕.以“数字化转型”为主题,来自微软全球的近百位顶尖技术专家.工程师和业务负责人拔冗而至,在 130 余场的专业技 ...
- SOL的补充
之前写过一些关于远程安装系统的文档,但是对于SOL还是糊涂不清. Serial Console 可以将输入输出转发到串行接口(com1, com2), 假如你有串行读取设备,就可以看到显示,控制输入. ...
- PL/SQL Developer import and export database method and illustrate
PL/SQL Developer import and export database method and illustrate HOW WELL DO YOU KNOW THE APPLE U ...
- 用AutoHotkey一键完成Xmind里的几个功能
F5一键添加超链接(类型为主题),常规步骤:Ctrl_h打开窗口,点击[主题],激活光标到输入框. Ctrl-i一键添加截取的图片,常规步骤是:打开画图→粘贴→保存图片为文件→Xmind里Ctrl-i ...
- O/S-Error: (OS 23) Data error (cyclic redundancy check)问题处理
RMAN-03002: backup plus archivelog 命令 (在 08/24/2015 03:31:00 上) 失败ORA-19501: 文件 "XXXXXX.DBF&quo ...