溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java8中Lambda表達式和Stream API的示例分析

發(fā)布時間:2021-08-09 11:23:49 來源:億速云 閱讀:146 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Java8中Lambda表達式和Stream API的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Java8中Lambda表達式和Stream API的示例分析”這篇文章吧。

前言

Java8 的新特性:Lambda表達式、強大的 Stream API、全新時間日期 API、ConcurrentHashMap、MetaSpace??偟脕碚f,Java8 的新特性使 Java 的運行速度更快、代碼更少、便于并行、最大化減少空指針異常。

0x00. 前置數(shù)據(jù)

private List<People> peoples = null;

@BeforeEach void before () {
  peoples = new ArrayList<>();
  peoples.add(new People("K.O1", 21, new Date()));
  peoples.add(new People("K.O3", 23, new Date()));
  peoples.add(new People("K.O4", 24, new Date()));
  peoples.add(new People("K.O5", 25, new Date()));
  peoples.add(new People("K.O2", 22, new Date()));
  peoples.add(new People("K.O6", 26, new Date()));
}

0x01. 提取對象中的一列

/**
* 提取1列
*/
@Test void whenExtractColumnSuccess () {
  //第一種寫法
  List<Integer> ages1 = peoples.stream().map(people -> people.getAge()).collect(Collectors.toList());
  System.out.println("###println: args1----");
  ages1.forEach(System.out::println);

  //簡單一點的寫法
  List<Integer> ages2 = peoples.stream().map(People::getAge).collect(Collectors.toList());
  System.out.println("###println: args2----");
  ages1.forEach(System.out::println);
}

###println: args1----
21
22
23
24
25
26
###println: args2----
21
22
23
24
25
26

/**
  * 只要年紀大于25歲的人
  */
@Test void whenFilterAgeGT25Success () {
  List<People> peoples1 = peoples.stream().filter(x -> x.getAge() > 25).collect(Collectors.toList());
  peoples1.forEach(x -> System.out.println(x.toString()));
}

People{name='K.O6', age=26, birthday=Wed May 15 22:20:22 CST 2019}

0x03. 列表中對象數(shù)值型列數(shù)據(jù)求和

/**
  * 求和全部年紀
  */
@Test void sumAllPeopleAgeSuccess () {
  Integer sum1 = peoples.stream().collect(Collectors.summingInt(People::getAge));
  System.out.println("###sum1: " + sum1);
  Integer sum2 = peoples.stream().mapToInt(People::getAge).sum();
  System.out.println("###sum2: " + sum2);
}

    ###sum1: 141
    ###sum2: 141

0x04. 取出集合符合條件的第一個元素

/**
  * 取出年紀為25歲的人
  */
@Test void extractAgeEQ25Success () {
  Optional<People> optionalPeople = peoples.stream().filter(x -> x.getAge() == 25).findFirst();
  if (optionalPeople.isPresent()) System.out.println("###name1: " + optionalPeople.get().getName());

  //簡寫
  peoples.stream().filter(x -> x.getAge() == 25).findFirst().ifPresent(x -> System.out.println("###name2: " + x.getName()));
}

###name1: K.O5
###name2: K.O5

0x05. 對集合中對象字符列按規(guī)則拼接

/**
  * 逗號拼接全部名字
  */
@Test void printAllNameSuccess () {
  String names = peoples.stream().map(People::getName).collect(Collectors.joining(","));
  System.out.println(names);
}

K.O1,K.O2,K.O3,K.O4,K.O5,K.O6

0x06. 將集合元素提取,轉(zhuǎn)為Map

/**
  * 將集合轉(zhuǎn)成(name, age) 的map
  */
@Test void list2MapSuccess () {
  Map<String, Integer> map1 = peoples.stream().collect(Collectors.toMap(People::getName, People::getAge));
  map1.forEach((k, v) -> System.out.println(k + ":" + v));

  System.out.println("--------");

  //(name object)
  Map<String, People> map2 = peoples.stream().collect(Collectors.toMap(People::getName, People::getThis));
  map2.forEach((k, v) -> System.out.println(k + ":" + v.toString()));
}

//People中自己實現(xiàn)的方法
public People getThis () {
  return this;
}

K.O2:22
K.O3:23
K.O1:21
K.O6:26
K.O4:24
K.O5:25
--------
K.O2:People{name='K.O2', age=22, birthday=Wed May 15 22:42:39 CST 2019}
K.O3:People{name='K.O3', age=23, birthday=Wed May 15 22:42:39 CST 2019}
K.O1:People{name='K.O1', age=21, birthday=Wed May 15 22:42:39 CST 2019}
K.O6:People{name='K.O6', age=26, birthday=Wed May 15 22:42:39 CST 2019}
K.O4:People{name='K.O4', age=24, birthday=Wed May 15 22:42:39 CST 2019}
K.O5:People{name='K.O5', age=25, birthday=Wed May 15 22:42:39 CST 2019}

0x07. 按集合某一屬性進行分組

/**
  * 按名字分組
  */
@Test void listGroupByNameSuccess() {
  //添加一個元素方便看效果
  peoples.add(new People("K.O1", 29, new Date()));
  Map<String, List<People>> map = peoples.stream().collect(Collectors.groupingBy(People::getName));

  map.forEach((k, v) -> System.out.println(k + ":" + v.size()));
}

K.O2:1
K.O3:1
K.O1:2
K.O6:1
K.O4:1
K.O5:1

0x08. 求集合對象數(shù)值列平均數(shù)

/**
  * 求人平均年齡
  */
@Test void averagingAgeSuccess () {
  Double avgAge = peoples.stream().collect(Collectors.averagingInt(People::getAge));
  System.out.println(avgAge);
}

23.5

0x09. 對集合按某一列排序

/**
  * 按年齡排序
  */
@Test void sortByAgeSuccess () {
  System.out.println("###排序前---");
  peoples.forEach(x -> System.out.println(x.getAge()));

  peoples.sort((x, y) -> {
    if (x.getAge() > y.getAge()) {
      return 1;
    } else if (x.getAge() == y.getAge()) {
      return 0;
    }
    return -1;
  });

  System.out.println("###排序后---");
  peoples.forEach(x -> System.out.println(x.getAge()));
}

###排序前---
21
23
24
25
22
26
###排序后---
21
22
23
24
25
26

以上是“Java8中Lambda表達式和Stream API的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI