zoukankan      html  css  js  c++  java
  • Java 8 lambda表达式

      java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组、过滤、求和、最值、排序、去重。跟之前的传统写法对比,能少写不少代码。

      新建实体类

      package com.vvvtimes.vo;

      import java.math.BigDecimal;

      import java.util.Date;

      public class User {

      private Long id;

      //姓名

      private String name;

      //年龄

      private int age;

      //工号

      private String jobNumber;

      //性别

      private String sex;

      //入职日期

      private Date entryDate;

      //家庭成员数量

      private BigDecimal familyMemberQuantity;

      public Long getId() {

      return id;

      }

      public void setId(Long id) {

      this.id = id;

      }

      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 String getJobNumber() {

      return jobNumber;

      }

      public void setJobNumber(String jobNumber) {

      this.jobNumber = jobNumber;

      }

      public String getSex() {

      return sex;

      }

      public void setSex(String sex) {

      this.sex = sex;

      }

      public Date getEntryDate() {

      return entryDate;

      }

      public void setEntryDate(Date entryDate) {

      this.entryDate = entryDate;

      }

      public BigDecimal getFamilyMemberQuantity() {

      return familyMemberQuantity;

      }

      public void setFamilyMemberQuantity(BigDecimal familyMemberQuantity) {

      this.familyMemberQuantity = familyMemberQuantity;

      }

      }

      1.分组

      通过groupingBy可以分组指定字段

      //分组

      Map> groupBySex = userList.stream().collect(Collectors.groupingBy(User::getSex));

      //遍历分组

      for (Map.Entry> entryUser : groupBySex.entrySet()) {

      String key = entryUser.getKey();

      List entryUserList = entryUser.getValue();

      2.过滤

      通过filter方法可以过滤某些条件

      //过滤

      //排除掉工号为201901的用户

      List userCommonList = userList.stream().filter(a -> !a.getJobNumber().equals("201901")).collect(Collectors.toList());

      3.求和

      分基本类型和大数类型求和,基本类型先mapToInt,然后调用sum方法,大数类型使用reduce调用BigDecimal::add方法

      //求和

      //基本类型

      int sumAge = userList.stream().mapToInt(User::getAge).sum();

      //BigDecimal求和

      BigDecimal totalQuantity = userList.stream().map(User::getFamilyMemberQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);

      上面的求和不能过滤bigDecimal对象为null的情况,可能会报空指针,这种情况,我们可以用filter方法过滤,或者重写求和方法

      重写求和方法

      package com.vvvtimes.util;

      import java.math.BigDecimal;

      public class BigDecimalUtils {

      public static BigDecimal ifNullSet0(BigDecimal in) {

      if (in != null) {

      return in;

      }无锡男科医院 http://www.bhnkyixue.com/

      return BigDecimal.ZERO;

      }

      public static BigDecimal sum(BigDecimal ...in){

      BigDecimal result = BigDecimal.ZERO;

      for (int i = 0; i < in.length; i++){

      result = result.add(ifNullSet0(in[i]));

      }

      return result;

      }

      }

      使用重写的方法

      BigDecimal totalQuantity2 = userList.stream().map(User::getFamilyMemberQuantity).reduce(BigDecimal.ZERO, BigDecimalUtils::sum);

      判断对象空

      stream.filter(x -> x!=null)

      stream.filter(Objects::nonNull)

      判断字段空

      stream.filter(x -> x.getDateTime()!=null)

      4.最值

      求最小与最大,使用min max方法

      //最小

      Date minEntryDate = userList.stream().map(User::getEntryDate).min(Date::compareTo).get();

      //最大

      Date maxEntryDate = userList.stream().map(User::getEntryDate).max(Date::compareTo).get();

      5.List 转map

      /**

      * List -> Map

      * 需要注意的是:

      * toMap 如果集合对象有重复的key,会报错Duplicate key ....

      * user1,user2的id都为1。

      * 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2

      */

      Map userMap = userList.stream().collect(Collectors.toMap(User::getId, a -> a,(k1,k2)->k1));

      6.排序

      可通过Sort对单字段多字段排序

      //排序

      //单字段排序,根据id排序

      userList.sort(Comparator.comparing(User::getId));

      //多字段排序,根据id,年龄排序

      userList.sort(Comparator.comparing(User::getId).thenComparing(User::getAge));

      7.去重

      可通过distinct方法进行去重

      //去重

      List idList = new ArrayList();

      idList.add(1L);

      idList.add(1L);

      idList.add(2L);

      List distinctIdList = idList.stream().distinct().collect(Collectors.toList());

      8.获取list某个字段组装新list

      //获取list对象的某个字段组装成新list

      List userIdList = userList.stream().map(a -> a.getId()).collect(Collectors.toList());

      9.批量设置list列表字段为同一个值

      addList.stream().forEach(a -> a.setDelFlag("0"));

  • 相关阅读:
    Excel VB Script
    Excel Text Converter as C# Format
    快捷键
    如何使用 MasterPage
    Excel 오른쪽버튼 윗주
    Oracle Hints
    ASP.NET 弹出窗口
    Log4Net
    word 修改 表宽度
    While 나가는 법
  • 原文地址:https://www.cnblogs.com/djw12333/p/11275215.html
Copyright © 2011-2022 走看看