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();});
}
}

最新文章

  1. [UCSD白板题] Least Common Multiple
  2. PAT A 1014. Waiting in Line (30)【队列模拟】
  3. java hashtable
  4. Android之开发杂记(二)
  5. CMDB反思1
  6. SQL跨表更新
  7. MS SQL 性能优化
  8. PCB板可靠性测试方法择要
  9. 网络编程之TCP异步群聊:客户端代码
  10. VMware Ubuntu安装详细过程
  11. Html5 Canvas Hit Testing
  12. org.hibernate.exception.JDBCConnectionException: could not execute query
  13. thinkphp 3.2 导入第三方类库的两种方式
  14. S2SH框架整合(注解)Struts2+Spring+Hibernate+MySql
  15. sqlserver—数据完整性(理论篇)
  16. mysql中null与“空值”的坑
  17. Appium+Python自动化 1 环境搭建(适用windows系统-Android移动端自动化)
  18. 初学JDBC的一些总结(二)
  19. 常用的评价指标:accuracy、precision、recall、F1-score、ROC-AUC、PR-AUC
  20. Contest with Drinks Easy

热门文章

  1. Spark RDD概念学习系列之不同角度看RDD
  2. Android中的事件分发机制
  3. python2中新式类和旧式类的对比【译】
  4. SQL Server死锁排查
  5. Run-time type information--RTTI
  6. J2EE概念汇总
  7. flex-2
  8. CSS布局总结(三)
  9. Vue -- 只弹一次的弹框
  10. spring mvc 下载的时候中文文件名不显示