JAVA8 - Lambda表達(dá)式的簡單應(yīng)用
前言: JAVA8帶來了很多有趣和高效的新東西,其中Lambda表達(dá)式和函數(shù)式編程應(yīng)該是其中最靚的點(diǎn)了.今天我們來簡單認(rèn)識下 JAVA8-Lambda
首先,我們來看點(diǎn)小知識,平常我們在寫了業(yè)務(wù)流程后,總不可避免的要構(gòu)造一些測試數(shù)據(jù)來驗證我們的代碼.那么,大家在平時工作中學(xué)用的構(gòu)造數(shù)據(jù)的方式都有什么呢,這里我來給大家推薦幾種快速構(gòu)造測試數(shù)據(jù)的小Demo.
public class JavaTest {
/** 測試時,經(jīng)常需要快速初始化一個集合來測試程序. */
// 初始化一個不可變List<Integer>
static List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 5);
// 初始化一個可變List<Integer>
static List<Integer> edIntegers = new ArrayList<>(integers);
// 初始化一個可變Set<Integer>
static Set<Integer> setIntegers = new HashSet<>(integers);
// 另類的快速初始化List<String>
static List<String> strings = new ArrayList<String>() {
private static final long serialVersionUID = 1L;
{
add("abc");
add("bca");
add("acb");
}
};
// 另類快速初始化一個Map<String,Integer>
static Map<String, Integer> ages = new HashMap<String, Integer>() {
private static final long serialVersionUID = 1L;
{
put("HP", 12);
put("ASUS", 15);
put("HuaWei", 22);
}
};
// 另類快速初始化一個List<Map<String,Integer>>
static List<Map<String, Integer>> strAges = new ArrayList<Map<String, Integer>>() {
{
add(new HashMap<String, Integer>(){
{
put("HP", 12);
put("ASUS", 15);
put("HuaWei", 22);
}
});
add(new HashMap<String, Integer>() {
{
put("HP", 22);
put("ASUS", 35);
put("HuaWei", 42);
}
});
add(new HashMap<String, Integer>() {
{
put("HP", 11);
put("ASUS", 25);
put("HuaWei", 32);
}
});
}
};
接下來我們來用 Lambda 表達(dá)式來操作這些數(shù)據(jù).
1.我們在測試中對數(shù)據(jù)常用的就是遍歷,我們在測試類中添加如下方法:
/** 資源遍歷 */
private static void each() {
// 遍歷List測試.
integers.forEach(System.out::print);// =>1 2 3 4 5 5
System.out.println();
edIntegers.forEach(System.out::print);// =>1 2 3 4 5 5
System.out.println();
setIntegers.forEach(System.out::print);// =>1 2 3 4 5
System.out.println();
strings.forEach(System.out::print);// =>abc bca acb
System.out.println();
// 遍歷Map測試
ages.forEach((key, value) -> {
System.out.print("{" + key + ":");
System.out.println(value + "}");
});// =>{HP:12} {HuaWei:22} {ASUS:15}
}
在main方法中調(diào)用此 each() 方法即可看到上述執(zhí)行結(jié)果.
2.java8 中流的 sorted 排序讓數(shù)據(jù)集的排序變得更簡單明了,同樣我們創(chuàng)建如下方法并在 main方法中調(diào)用 .
/** 資源排序 */
private static void sorted() {
// List 排序 Comparator.reverseOrder() 是將順序顛倒.
integers.stream().sorted(Comparator.reverseOrder()).forEach(System.out::print);// =>5 5 4 3 2 1
System.out.println();
strings.stream().sorted().forEach(System.out::print);// =>abc acb bca
System.out.println();
strings.stream().sorted(Comparator.reverseOrder()).forEach(System.out::print);// =>bca acb abc
System.out.println();
// List<Map> 根據(jù)某字段排序
strAges.stream().sorted((a, b) -> {
return a.get("HP").compareTo(b.get("HP"));
}).forEach(x -> {
System.out.print(x);
});// =>{HP=11, HuaWei=32, ASUS=25} {HP=12, HuaWei=22, ASUS=15} {HP=22, HuaWei=42, ASUS=35}
}
3. java8中stream的 filter提供了一種簡單的過濾數(shù)據(jù)集得到我們想要的結(jié)果集的方法.
/** 資源過濾 */
private static void filter() {
// List 過濾
integers.stream().filter(x -> x.compareTo(2) > -1).forEach(System.out::print);// => 2 3 4 5 5
System.out.println();
strings.stream().filter(x -> x.indexOf("a") < 2).forEach(System.out::print);// =>abc acb
System.out.println();
// List<Map> 根據(jù)某字段過濾
strAges.stream().filter(x -> x.get("ASUS").compareTo(20) > 0).forEach(System.out::print);
// =>{HP=22, HuaWei=42, ASUS=35} {HP=11, HuaWei=32, ASUS=25}
}
4. 有時候我們需要將集合中的數(shù)據(jù)進(jìn)行一定方式處理后返回,以滿足我們的應(yīng)用場景.java8 stream的map可以滿足你的需求.
/** 資源轉(zhuǎn)換 */
private static void transfer() {
// 取List<Map>中一個字段組成新的List
List<Integer> ASUS_Ages = strAges.stream().map(x -> x.get("ASUS")).collect(Collectors.toList());
ASUS_Ages.forEach(System.out::print);// =>15 35 25
System.out.println();
// 將List<Integer> 中元素求和
Integer ages = ASUS_Ages.stream().reduce(0, (a, b) -> a + b);
System.out.println(ages);// => 75
}
大家看得過癮不? 希望每天都有進(jìn)步哦!
最后附上 main中代碼.
public static void main(String[] args) {
each();
sorted();
filter();
transfer();
}