當前位置:
首頁 > 知識 > java函數式編程Lambda表達式的示例(一)

java函數式編程Lambda表達式的示例(一)

關於函數式編程的一些理解

函數式編程是時下比較流行的編程方式了,很多新興的編程語言都對函數式編程有了比較好的支持,她有別於傳統的命令式編程,可以將函數(執行代碼的過程)作為參數進行傳遞。JAVA也意識到了函數式編程的重要性,在2014年Oracle終於發布了JAVA8的版本,增加了諸如函數式編程、Lambda表達式、Stream流等新的特性,正因為有了這些新的功能,我們以後在編寫JAVA代碼的時候,有了一種新的選擇。

熟練地使用函數式編程開發,可以讓代碼變得更簡潔、優雅,可讀性也能更強。但是,從命令式編程轉向函數式編程還是需要一定努力的,因為在編碼的思路上,兩種開發模式真的有很大的區別,這也是有相當一部分的JAVA開發者還是比較熱衷於使用傳統的開發方式的原因。

儘管如此,函數式編程始終是以後編碼開發的方向,因為她更優雅且開發效率會更高,所以我覺得現在就應該開始多熟悉函數式編程了哦,以後一定會用上的。對於Lambda表達式,我也還是處在初學者的狀態,用起來感覺很不方便,往往當我有某個明確目標的時候,我卻不知道使用何種方法或如何使用該方法來達到自己的目的。因此,最近我自己也在做一些Lambda的例子,幫助我去學習,效果還行,在這裡也是想做一下分享,歡迎指正。

lambda表達式的例子

一、關於stream、filter、map、reduce

public static void main(String[] args) {

List list = Arrays.asList("max","min","vue","java","scala");

long sum = list.stream.filter(str -> str.startsWith("m")).count;

System.out.println("以m開頭的數量是:" + sum);

int sum2 = list.stream.mapToInt(String::length).reduce((s,item) -> s + item).getAsInt;

System.out.println("所有字母的長度總和:" + sum2);

int sum3 = list.stream.filter(str -> str.startsWith("m")).mapToInt(String::length).reduce((s,item) -> s + item).getAsInt;

System.out.println("以m開頭的單詞總長度:" + sum3);

}

1.stream方法為集合打開了一個流,於是通過這個流,開發者就可以操作諸如過濾、映射、分組、計算等一系列的操作了。

2.filter即是過濾的方法,在第一個例子中,找出以m字母開頭的單詞,並過濾成了新的流,然後計算單詞的數量。

3.mapToInt是映射的方法,根據單詞的長度映射成了新的流,新的流中是一個關於單詞長度的集合。

4.reduce是計算的方法,根據單詞長度集合的流,將單詞長度進行相加,返回最終結果。

二、關於collect、groupingBy

創建一個User類,方便以後我們加到集合中

public class User {

private String name;
private int age;
private int sex;

public User{

}
public User(String name, int age) {
super;
this.name = name;
this.age = age;
}
public User(String name, int age,int sex) {
super;
this.name = name;
this.age = age;
this.sex = sex;
}
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 getSex {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
@Override
public String toString {
return "User [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}

}

生成一個List工具類,用於生成User集合

import java.util.ArrayList;
import java.util.List;

public class ListUtil {

public static List getUserList{

User u1 = new User("lilei",20,1);
User u2 = new User("limei",31,1);
User u3 = new User("min",12,0);
User u4 = new User("max",33,0);
User u5 = new User("test",35,0);

List list = new ArrayList;
list.add(u1);
list.add(u2);
list.add(u3);
list.add(u4);
list.add(u5);

return list;
}
}

在上述類的幫助下,寫一個針對新建集合和分組的例子

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class SecondTest {
/**
* 獲取每個用戶的年齡,生成新數組,並列印
*/
@SuppressWarnings("unchecked")
private static void getAllUserAge{

List list = ListUtil.getUserList;
//獲取每個用戶的年齡,生成新數組,並列印

System.out.println("
");
List ageList2 = list.stream.map(User::getAge).collect(Collectors.toList);
ageList2.stream.forEach(obj -> {
System.out.print(obj + " ");

});
System.out.println("
");
}
/**
* 按性別分類,計算年齡總和
*/
@SuppressWarnings("unchecked")
public static void getManUserAgeSum{
List list = ListUtil.getUserList;

list.forEach(user -> System.out.println(user));

Map map = list.stream.collect(Collectors.groupingBy(User::getSex,Collectors.reducing(0,User::getAge,Integer::sum)));
map.forEach((k,v)->System.out.println("k: "+ k + " v: "+v));
}

@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
//獲取每個用戶的年齡,生成以年齡組成的新數組
getAllUserAge;
//按性別分類,計算年齡總和
getManUserAgeSum;

}
}

1.getAllUserAge方法獲取每個用戶的年齡,並將用戶的年齡組成一個新的集合,collect(Collectors.toList)用於將流轉成ArrrayList類。

2.getManUserAgeSum方法,將所有用戶按性別進行分類,並計算了每個性別的年齡之和。通過groupingBy方法實現,在這裡groupingBy接收兩個參數,第一個參數指定group by 的目標,第二個參數表示分組之後,需要進行的操作。最後,方法會返回一個Map對象,性別是鍵,年齡之和就是值。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

「2017-05-25」WebForm母版頁

TAG:科技優家 |

您可能感興趣

lambda表達式foreach性能分析
不要在Python中編寫 lambda 表達式了
Adidas Sobakov 一款旨在表達足球圈熱情的街頭經典鞋 | Xsneaker
Diabetes:新研究發現調節leptin表達的lncRNA
Scala 正則表達式
Linux shell 邏輯運算符、邏輯表達式詳解
無法用言語表達的愛!The Void/IF I Were a cat/The Colour Monster
Being in the World——淺談Olafur Eliasson作品在建築、景觀、及城市設計視角下的表達
Clin Exp Metastasis:HIF-1α增加Sema4D的表達和分泌,抑制肺癌骨轉移中的成骨
MongoDB 正則表達式
Python 正則表達式
J Periodontol:振動增強hpdl細胞中PGE 2、IL-6和IL-8的表達
Python中的正則表達式
Giambattista Valli利用蕾絲雪紡花朵元素表達優雅和柔美
旨在表達自我!NIKE x Patta全新膠囊系列Lookbook發布!
Python 正則表達式(分組)
袁風嬌┃Lactobacillus plantarum苯丙酮酸還原酶的異源表達及其在苯乳酸製備中的應用
英語口語:pay in lump-sum一次性付款的英語表達怎麼說?
Kawhi Leonard表達想被交易到湖人的意願
XQuery FLWOR 表達式