Lambda在jdk1.8里面已经很好用了,在这里不讲底层的实现,只有简单的用法,会继续补全。

首先一个list我们要使用lambda的话,需要使用它的stream()方法,获取流,才能使用后续的方法。

基础类User.java

public class User {

  public long userId;

  public User() {
} public User(long userId, String name, int age) {
this.userId = userId;
this.name = name;
this.age = age;
} public String name;
public int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public long getUserId() {
return userId;
} public void setUserId(long userId) {
this.userId = userId;
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", userId=" + userId +
'}';
} public void output() {
System.out.println("User{" +
"name='" + name + '\'' +
", age=" + age +
", userId=" + userId +
'}');
}
}

1.遍历元素

使用foreach方法,其中s->里面的s指list里面的每一个元素,针对每一个元素都执行后续的方法。如果里面只有一句话,可以直接缩写foreach(n -> System.out.println(n));,如果需要执行的方法里面有两句或者多句需要执行的话,需要可以使用list.stream().forEach(s -> {System.out.println(s);});形式。

  // 遍历list(String)和对象
public static void foreachListString() {
List features = Arrays.asList("Lambdas", "Default Method", "Stream API",
"Date and Time API");
features.forEach(n -> System.out.println(n));
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// s代表的是里面的每一个元素,{}里面就是每个元素执行的方法,这个比较容易理解
list.stream().forEach(s -> {
System.out.println(s);
}); // 处理对象
List<User> users = new ArrayList<>();
User user1 = new User();
user1.setAge(1);
user1.setName("user1");
user1.setUserId(1);
users.add(user1);
users.stream().forEach(s -> s.output());
}

2.转化里面的每一个元素

map是需要返回值的,s代表里面的每一个元素,return 处理后的返回值

public static void mapList() {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
List<String> list2 = new ArrayList<>();
// map代表从一个转成另一个,s代表里面的每一个值,{}代表针对每一个值的处理方法,如果是代码句子,则需要有返回值
// 返回值代表转化后的值,以下两种都可以
list2 = list.stream().map(s -> {
return s.toUpperCase();
}).collect(Collectors.toList());
list2.stream().forEach(s -> {
System.out.println(s);
});
list2 = list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
list2.stream().forEach(s -> {
System.out.println(s);
});
}

3.条件过滤筛选

使用filter函数,里面的表达式也是需要返回值的,返回值应该为boolean类型,也就是符合条件的就保留在list里面,不符合条件的就被过滤掉。

  // filter过滤
public static void filterList() {
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
list1.add("aasd");
list1.add("agdfs");
list1.add("bdfh");
list2 = list1.stream().filter(s -> {
return s.contains("a");
}).collect(Collectors.toList());
list2.stream().forEach(s -> {
System.out.println(s);
});
}

4.取出list里面的对象中的元素,返回一个特定的list

这个可以让我们取出list集合中的某一个元素,也是使用map即可。

  // list集合中取出某一属性
public static void getAttributeList() {
List<User> list = new ArrayList<>();
User user1 = new User();
user1.setUserId(1);
user1.setName("James");
user1.setAge(13);
list.add(user1);
User user2 = new User();
user2.setUserId(2);
user2.setName("Tom");
user2.setAge(21);
list.add(user2);
// 两种书写方式都可以,一个是map里面,使用每一个实例调用User类的getName方法返回值就是转化后的值。
List<String> tableNames = list.stream().map(User::getName).collect(Collectors.toList());
tableNames.stream().forEach(s -> {
System.out.println(s);
});
List<String> tableNames1 = list.stream().map(u -> u.getName()).collect(Collectors.toList());
tableNames1.stream().forEach(s -> {
System.out.println(s);
});
}

5.分组

可以根据某一个属性来分组,获得map

  // 分组,每一组都是list
public static void groupBy() {
List<User> userList = new ArrayList<>();// 存放user对象集合
User user1 = new User(1, "张三", 24);
User user2 = new User(2, "李四", 27);
User user3 = new User(3, "王五", 21);
User user4 = new User(4, "张三", 22);
User user5 = new User(5, "李四", 20);
User user6 = new User(6, "王五", 28);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
//根据name来将userList分组
Map<String, List<User>> groupBy = userList.stream().collect(Collectors.groupingBy(User::getName));
System.out.println(groupBy);
}

6.对某一个属性进行求和

比如我们需要对年龄进行求和,可以使用mapToInt(),里面参数应该使用类名:方法名,最后需要使用sum()来求和。

public static void getSum(){
List<User> userList = new ArrayList<>();//存放user对象集合 User user1 = new User(1, "qw", 24);
User user2 = new User(2, "qwe", 27);
User user3 = new User(3, "aasf", 21);
User user4 = new User(4, "fa", 22);
User user5 = new User(5, "sd", 20);
User user6 = new User(6, "yr", 28); userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
// sum()方法,则是对每一个元素进行加和计算
int totalAge = userList.stream().mapToInt(User::getAge).sum();
System.out.println("和:" + totalAge);
}

7.将list转化成map

比如我们需要list里面的对象的id和这个对象对应,那就是需要转换成map。需要在collect()方法里面使用Collectors的toMap()方法即可,参数就是key和value。

 public static void listToMap(){
List<User> userList = new ArrayList<>(); User user1 = new User(1, "12", 22);
User user2 = new User(2, "21", 17);
User user3 = new User(3, "a", 11);
User user4 = new User(4, "a", 22);
User user5 = new User(5, "af", 22);
User user6 = new User(6, "fa", 25); userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6); Map<Long,User> userMap = userList.stream().collect(Collectors.toMap(User::getUserId, user -> user));
System.out.println("toMap:" + userMap.toString());
}

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

技术之路不在一时,山高水长,纵使缓慢,驰而不息。

公众号:秦怀杂货店

Lambda【1】-- List相关Lambda表达式使用(上篇)的更多相关文章

  1. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  2. Java 8特性探究(1):通往lambda之路与 lambda表达式10个示例

    本文由 ImportNew 函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口.比如Java标准库中的ja ...

  3. 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...

  4. 一个将lambda字符串转化为lambda表达式的公共类

    一个将lambda字符串转化为lambda表达式的公共类.StringToLambda 使用方式如下: var module = new Module(); url = url.ToLower();/ ...

  5. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  6. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  7. 你真的了解java的lambda吗?- java lambda用法与源码分析

    你真的了解java的lambda吗?- java lambda用法与源码分析 转载请注明来源:cmlanche.com 用法 示例:最普遍的一个例子,执行一个线程 new Thread(() -> ...

  8. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

  9. lambda 形参:返回值 lambda 匿名函数 格式:

    lambda 匿名函数 格式: lambda 形参:返回值 e.g f = lambda n:n**2 print(f(10))

  10. 委托,匿名方法,Lambda,泛型委托,表达式树

    一.委托:完成一个委托应分三个步骤://step01:首先用delegate定义一个委托;public delegate int CalculatorAdd(int x, int y);//step0 ...

随机推荐

  1. 题解:AT_arc116_b [ARC116B] Products of Min-Max

    在题库里面乱翻,就翻到了. 因为在这道题里面子序列不需要考虑元素顺序,所以原序列无论是什么顺序都不会影响答案. 所以先把元素按照从大到小的顺序排列,然后考虑每个元素的贡献. 在当前序列中,对于元素 \ ...

  2. KernelWarehouse:英特尔开源轻量级涨点神器,动态卷积核突破100+ | ICML 2024

    动态卷积学习n个静态卷积核的线性混合,加权使用它们输入相关的注意力,表现出比普通卷积更优越的性能.然而,它将卷积参数的数量增加了n倍,因此并不是参数高效的.这导致不能探索n>100的设置(比典型 ...

  3. HTML & CSS – Responsive Image 响应式图片 (完整版)

    前言 之前就有写过关于 Retina 和 Responsive Image 响应式图片 (responsive image) Retina 显示屏 但写的太烂了, 所以有了后来的 屏幕, 打印, 分辨 ...

  4. ASP.NET Core – Middleware

    前言 MIddleware 就是中间件, ASP.NET Core 是用来处理 http request 的. 当 request 抵到 server 就进入了 Middleware pipe. 每个 ...

  5. SpringMVC —— 请求参数

    请求映射路径    请求方式   get请求传参        post请求传参          POST请求中文参数乱码问题        请求参数(五种类型数据参数)               ...

  6. vscode单行注释失效解决办法

    第一种情况: bug:在使用快捷键注释的时候,只有style和script标签里的内容注释有问题,无法使用快捷键注释. 解决方法:禁用vscode的插件Jinja. 第二种情况 方法一 1.Ctrl+ ...

  7. 在 Node.js 中使用 ES6 模块 import 和 export

    1.Node版本 >= 13 2.使用 ES6 模块 a.js export const A = 'A'; index.js import { A } from './a.js'; consol ...

  8. Cache和DMA一致性

    DMA应该多多少少知道点吧.DMA(Direct Memory Access)是指在外接可以不用CPU干预,直接把数据传输到内存的技术.这个过程中可以把CPU解放出来,可以很好的提升系统性能.那么DM ...

  9. store文件夹的处理,vuex模块化modules

    index文件代码: import Vue from "vue"; import Vuex from "vuex"; // 导入根getters import ...

  10. 【ZROJ2730】简单题 可持久化分块题解

    Description 给定一棵 \(n\) 个节点的树,每次询问编号为 \([l, r]\) 的点中有多少个是祖先关系. \(n, q \le 10^5\). Solution 直接做的话树上的祖先 ...