Java8-Lambda(1)

匿名內部類實現

匿名內部類仍然是一個類,只是不需要程序員顯示指定類名,編譯器會自動爲該類取名。因此如果有如下形式的代碼,編譯之後將會產生兩個class文件

public class Main {
    public static void main(String[] args) {
        new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println("hello");
            }
        }).start();
    }
}

Lambda表達式實現

Lambda表達式通過invokedynamic指令實現,書寫Lambda表達式不會產生新的類。如果有如下代碼,編譯之後只有一個class文件

既然Lambda表達式不是內部類的簡寫,那麼Lambda內部的this引用也就跟內部類對象沒什麼關係了。在Lambda表達式中this的意義跟在表達式外部完全一樣

public class Main {
    public static void main(String[] args) {
        new Thread(
                () -> System.out.println("hello")
            ).start();
    }
}

集合常用方法

// 刪除長度大於3的元素
list.removeIf(str -> str.length()>3); 

//所有長度大於3的元素轉換成大寫,其餘元素不變
list.replaceAll(str -> {        
    if(str.length()>3)
        return str.toUpperCase();
    return str;
});

//排序
list.sort((str1, str2) -> str1.length()-str2.length());

//Map循環
map.forEach((k, v) -> System.out.println(k + "=" + v));

//有則返回,無則返回默認"NoValue"
map.getOrDefault(4, "NoValue");

//如果"key"不存在,則put "value"
map.putIfAbsent("key","value")

//替換所有的value大寫
map.replaceAll((k, v) -> v.toUpperCase());

//循環
Stream.of("I", "love", "you", "too").forEach(str -> System.out.println(str));

//過濾
Stream.of("I", "love", "you", "too").filter(str -> str.length()==3).forEach(str -> System.out.println(str));

//去重
 Stream.of("I", "love", "you", "too", "too").distinct()
    .forEach(str -> System.out.println(str));

//排序   
Stream.of("I", "love", "you", "too").sorted((str1, str2) -> str1.length()-str2.length()).forEach(str -> System.out.println(str));

//對每個元素按照某種操作進行轉換,轉換前後Stream中元素的個數不會改變,但元素的類型取決於轉換之後的類型。
Stream.of("I", "love", "you", "too").map(str -> str.toUpperCase()).forEach(str -> System.out.println(str));

reduce()

reduce操作可以實現從一組元素中生成一個值,sum()、max()、min()、count()等都是reduce操作,將他們單獨設爲函數只是因爲常用

//返回最大的值
Optional<String> longest = stream.reduce((s1, s2) -> s1.length()>=s2.length() ? s1 : s2);
//Optional<String> longest = stream.max((s1, s2) -> s1.length()-s2.length());

//累加
Integer lengthSum = stream.reduce(0, // 初始值 // (1)
        (sum, str) -> sum+str.length(), // 累加器 // (2)
        (a, b) -> a+b); // 部分和拼接器,並行執行時纔會用到 // (3)
// int lengthSum = stream.mapToInt(str -> str.length()).sum();

//轉list
List<String> list = stream.collect(Collectors.toList());
//轉set
Set<String> set = stream.collect(Collectors.toSet());
//轉map
//Function.identity()等價於t->t
Map<String, Integer> map = stream.collect(Collectors.toMap(Function.identity(), String::length)); // (3)

// 使用toCollection()指定規約容器的類型
ArrayList<String> arrayList = stream.collect(Collectors.toCollection(ArrayList::new));// (3)
HashSet<String> hashSet = stream.collect(Collectors.toCollection(HashSet::new));// (4)

// 使用toMap()統計學生GPA
Map<Student, Double> studentToGPA =students.stream().collect(Collectors.toMap(Functions.identity(),student -> computeGPA(student)));

//把集合分爲兩部分,滿足條件,或不滿足
Map<Boolean, List<Student>> passingFailing = students.stream()
         .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));

//按照某個屬性對數據進行分組,屬性相同的元素會被對應到Map的同一個key上
Map<Department, List<Employee>> byDept = employees.stream()
           .collect(Collectors.groupingBy(Employee::getDepartment));

// 先分組,然後統計
Map<Department, Integer> totalByDept = employees.stream()
           .collect(Collectors.groupingBy(Employee::getDepartment,                                           Collectors.counting()));// 下游收集器

// 按照部門對員工分佈組,並只保留員工的名字
Map<Department, List<String>> byDept = employees.stream()                .collect(Collectors.groupingBy(Employee::getDepartment,
                        Collectors.mapping(Employee::getName,
                                Collectors.toList())));

// 使用Collectors.joining()拼接字符串
Stream<String> stream = Stream.of("I", "love", "you");
String joined = stream.collect(Collectors.joining());// "Iloveyou"
String joined = stream.collect(Collectors.joining(","));// "I,love,you"
String joined = stream.collect(Collectors.joining(",", "{", "}"));// "{I,love,you}"
發佈了15 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章