java函數式編程Lambda表達式的示例(一)
關於函數式編程的一些理解
函數式編程是時下比較流行的編程方式了,很多新興的編程語言都對函數式編程有了比較好的支持,她有別於傳統的命令式編程,可以將函數(執行代碼的過程)作為參數進行傳遞。JAVA也意識到了函數式編程的重要性,在2014年Oracle終於發布了JAVA8的版本,增加了諸如函數式編程、Lambda表達式、Stream流等新的特性,正因為有了這些新的功能,我們以後在編寫JAVA代碼的時候,有了一種新的選擇。
熟練地使用函數式編程開發,可以讓代碼變得更簡潔、優雅,可讀性也能更強。但是,從命令式編程轉向函數式編程還是需要一定努力的,因為在編碼的思路上,兩種開發模式真的有很大的區別,這也是有相當一部分的JAVA開發者還是比較熱衷於使用傳統的開發方式的原因。
儘管如此,函數式編程始終是以後編碼開發的方向,因為她更優雅且開發效率會更高,所以我覺得現在就應該開始多熟悉函數式編程了哦,以後一定會用上的。對於Lambda表達式,我也還是處在初學者的狀態,用起來感覺很不方便,往往當我有某個明確目標的時候,我卻不知道使用何種方法或如何使用該方法來達到自己的目的。因此,最近我自己也在做一些Lambda的例子,幫助我去學習,效果還行,在這裡也是想做一下分享,歡迎指正。
lambda表達式的例子
一、關於stream、filter、map、reduce
public static void main(String[] args) {
List
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
//獲取每個用戶的年齡,生成新數組,並列印
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.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對象,性別是鍵,年齡之和就是值。
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 表達式