Java8新特性 利用流和Lambda表达式对List集合进行处理

时间:2022-09-22 09:24:50

Lambda表达式处理List

最近在做项目的过程中经常会接触到 lambda 表达式,随后发现它基本上可以替代所有 for 循环,包括增强for循环。也就是我认为,绝大部分的for循环都可以用 lambda 表达式改写。

lambda表达式有它自己的优点:(1)简洁,(2)易并行计算。尤其适用于遍历结果,循环计算数值或者赋值的时候非常方便。

缺点: (1)若不用并行计算,很多时候计算速度没有比传统的 for 循环快。

   (2)不容易使用debug模式调试。

   (3)在 lambda 语句中直接强制类型转换不方便。

   (4)不可以在foreach中修改foreach外面的值。

下面是一些我再开发过程中经常使用过的表达式去处理list集合。

(1)先新建一个实体类

 public class Person {

     private String name;
private int age;
private int size;
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 int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", size=" + size + "]";
}
public Person(String name, int age, int size) {
super();
this.name = name;
this.age = age;
this.size = size;
}
public Person() {
super();
// TODO Auto-generated constructor stub
} }

(2)写主函数。剩下的说明会写在代码中

 public class Jdk8Main {

     public static void main(String[] args) {
List<Person> list = new ArrayList<>();
Person p1 = new Person("张1",1,1);
Person p101 = new Person("张101",101,101);
Person p2 = new Person("张2",2,2);
Person p3 = new Person("张3",3,3);
Person p4 = new Person("张4",4,4);
Person p5 = new Person("张5",5,5);
Person p6 = new Person("张6",6,6);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p101); /**
* 1.forEach()进行遍历集合
* item:可以是任意值。类似于for循环中的循环值
*/
list.forEach(item->{
//设置值
item.setName(item.getName()+"测试");;
//输出语句
System.out.println(item.toString());
}); /**
* 2.stream()流操作
*/
//2.1. 去重 distinct() 去重;collect(Collectors.toList())。封装成集合
List<Person> distinctList = list.stream().distinct().collect(Collectors.toList());
//2.2 排序 sorted((第一个对象,第二个对象)->返回值) (升降序看是第几个对象与第几个对象比较)
List<Person> sortedList = list.stream().sorted((o1,o2)->o1.getAge()-o2.getAge()).collect(Collectors.toList());
//2.3 过滤 , filter(item->{}) item为每一项。 按照自己的需求来筛选list中的数据
List<Person> filterList = list.stream().filter(item->item.getAge()>3).collect(Collectors.toList());
//2.4 map(), 提取对象中的某一元素. 用每一项来获得属性(也可以直接用 对象::get属性())
List<String> mapList1 = list.stream().map(Person::getName).collect(Collectors.toList());
List<String> mapList2 = list.stream().map(item->item.getName()).collect(Collectors.toList());
//2.5 统计 sum() 。mapToDouble() 转换成double。还有其他类型转换。可以自己研究。
// max(),min(),average()
double sum = list.stream().mapToDouble(Person::getAge).sum();
//2.6 分组 Collectors.groupingBy(属性名)
Map<Integer, List<Person>> map = list.stream().collect(Collectors.groupingBy(Person::getAge));
//2.7 多重分组 Collectors.groupingBy(属性,Collectors.groupingBy(属性))
Map<String, Map<Integer, List<Person>>> map2 = list.stream().collect(Collectors.groupingBy(t->t.getName(),Collectors.groupingBy(t->t.getAge())));
//2.8 分组并计算综合 Collectors.summarizingLong()
Map<String, Map<Integer, LongSummaryStatistics>> map3 = list.stream().collect(Collectors.groupingBy(t->t.getName(),Collectors.groupingBy(t->t.getAge(),Collectors.summarizingLong(Person::getSize)))); /**
* 3. 集合比较的简写方式
*/
list.sort((o1,o2)->{return o1.getAge()-o2.getAge();});
}
}

Java8新特性 利用流和Lambda表达式对List集合进行处理的更多相关文章

  1. Java8新特性(一)——Lambda表达式与函数式接口

    一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...

  2. Java8新特性学习笔记&lpar;一&rpar; Lambda表达式

    没有用Lambda表达式的写法: Comparator<Transaction> byYear = new Comparator<Transaction>() { @Overr ...

  3. Java8新特性第1章&lpar;Lambda表达式&rpar;

    在介绍Lambda表达式之前,我们先来看只有单个方法的Interface(通常我们称之为回调接口): public interface OnClickListener { void onClick(V ...

  4. Java1&period;8新特性——接口改动和Lambda表达式

    Java1.8新特性——接口改动和Lambda表达式 摘要:本文主要学习了Java1.8的新特性中有关接口和Lambda表达式的部分. 部分内容来自以下博客: https://www.cnblogs. ...

  5. 功能:Java8新特性steam流

    Java8新特性steam流 一.包装数据类型 @Test public void main22() { List<Integer> list = new ArrayList<Int ...

  6. Java8新特性 1——利用流和Lambda表达式操作集合

    Java8中可以用简洁的代码来操作集合,比如List,Map,他们的实现ArrayList.以此来实现Java8的充分利用CPU的目标. 流和Lambda表达式都是Java8中的新特性.流可以实现对集 ...

  7. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  8. Java8 新特性之流式数据处理

    一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现.比如我们希望对一个包含整数的 ...

  9. Java8 新特性之流式数据处理&lpar;转&rpar;

    转自:https://www.cnblogs.com/shenlanzhizun/p/6027042.html 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作 ...

随机推荐

  1. Swing 刷新容器

    JPanel pchks = new JPanel();// 容器刷新(重新layout所有空间)pchks.validate();// 容器重绘(当容器内的东西由多变少时,防止多出来的部分没有清楚) ...

  2. Spring---Web MVC关于前台传值转换问题

    Cannot convert value of type [java.lang.String] to required type [java.util.List]. 问题在于:(String to E ...

  3. Jmeter返回参数值写入文件《一》

    在用Jmeter做自动化测试的时候,某些特殊情况下我们需要将Jmeter的返回的某个特殊值写入的文件中,那么我们该如何做呢? 对于Jmeter这个工具来说,我们不难知道,它是一个java开源的可扩展的 ...

  4. scrapy 爬取时很多重复 及日志输出

    日志输出参考:https://blog.csdn.net/weixin_41666747/article/details/82716688 首先 item 要设置循环外 第二,request 要设置下 ...

  5. GO 基础

    基本语法练习 打印 乘法表 package main import ("fmt") func main(){ for n:=1;n<=9;n++{ for m:=1;m&lt ...

  6. python学习之——习题二

    习题二:求1-100的所有数的和 首先明确,1-100的数字相加一直是前面加后面,如,1+2+3+4......我们平常的计算方法是1+2等于3,然后再使用3+3等于6,然后6+4等于10以此类推加到 ...

  7. matplotlib python

    #导入包 import matplotlib.pyplot as plt import numpy as np # 从[-1,1]中等距去50个数作为x的取值 x = np.linspace(-1, ...

  8. 【搜索】 Find The Multiple

    #include<stdio.h> #include<stdlib.h> #include<string.h> bool found; void DFS(unsig ...

  9. 解决Navicat Premium终端操作mysql ONLY&lowbar;FULL&lowbar;GROUP&lowbar;BY错误

    解决navicate终端操作mysql ONLY_FULL_GROUP_BY错误     问题描述: [Err] 1055 - Expression #1 of SELECT list is not ...

  10. Android MD5算法

    package com.example.myapi.md5; import java.io.UnsupportedEncodingException; import java.security.Mes ...