1. 程式人生 > >Lambda學習---方法引用和其他基本應用

Lambda學習---方法引用和其他基本應用

截取 map 數量 AR foreach sum -a world ID

  1 package com.zx;
  2 
  3 import java.util.*;
  4 import java.util.function.*;
  5 import java.util.stream.Collectors;
  6 import java.util.stream.Stream;
  7 
  8 /**
  9  * lambdaTest類
 10  *
 11  * @author ning
 12  * @create 2018-06-11 17:19
 13  **/
 14 public class LambdaTest {
 15 
 16     public
static void main(String[] args){ 17 18 new Thread(() -> {System.out.println("lambda創建一個新線程");}).start(); 19 20 List<String> listStr = Arrays.asList("Java","C","C++","C#","Python","PHP"); 21 StringBuilder sb = new StringBuilder(); 22 listStr.forEach(n -> System.out.println(sb.append(",").append(n)));
23 24 /** 25 * 用特殊符號拼接 26 * */ 27 String collect = listStr.stream().collect(Collectors.joining(",")); 28 System.out.println(collect); 29 String collect1 = listStr.stream().collect(Collectors.joining("#")); 30 System.out.println(collect1);
31 32 listStr.sort((a,b) -> a.compareTo(b)); 33 System.out.println(listStr); 34 35 String abc = "hello"; 36 Consumer<String> consumer = (a) -> {}; 37 38 Function<String,String> function = x -> x.toUpperCase(); 39 String zsdf = function.apply("zsdf"); 40 System.out.println(zsdf); 41 42 /** 43 * 靜態方法引用 44 * 語法格式- - 類目::staticMethod 45 */ 46 //只有一個輸出 47 Supplier<String> supplier = LambdaTest::put; 48 System.out.println(supplier.get()); 49 //只有一個輸入 50 Consumer<String> c1 = LambdaTest::consume; 51 c1.accept("張三"); 52 //一個輸入,一個輸出 53 Function<String, String> f1 = LambdaTest::convertUp; 54 System.out.println(f1.apply("a")); 55 //兩個輸入,一個輸出 56 BiFunction<String,String,Integer> biFunction = LambdaTest::getLength; 57 System.out.println(biFunction.apply("abc","123")); 58 ////////////////////// 方法的引用 - start //////////////////////// 59 /** 60 * 實例方法引用 61 * 語法格式- - 實例::實例Method 62 */ 63 Supplier<String> s1 = new LambdaTest()::put1; 64 System.out.println(s1.get()); 65 LambdaTest lt = new LambdaTest(); 66 Consumer<String> c2 = lt::consume1; 67 c2.accept("王五"); 68 69 /** 70 * 對象方法引用 71 * 定義:抽象方法的第一個參數類型【最好是自定義的類型】剛好是實例方法的類型【言外之意,必需有參數】,抽象方法剩余的參數恰好可以當作實例方法的參數。 72 * 如果函數式接口的實現能用上面說的實例方法調用來實現的話,那麽就可以使用對象方法引用 73 * 語法格式- - 類名::實例Method 74 */ 75 Consumer<Too> c3 = (Too too) -> new Too().too(); 76 c3.accept(new Too()); 77 Consumer<Too> c4 = Too::too; 78 c4.accept(new Too()); 79 BiConsumer<Too,String> c5 = (too, ac) -> new Too().too1(ac); 80 c5.accept(new Too(),"寧大人"); 81 //兩個輸入,一個輸出 82 BiFunction<Too, String, Integer> biFunction1 = (p,s) -> new Too().too2(s); 83 BiFunction<Too, String, Integer> biFunction2 = Too::too2; 84 System.out.println(biFunction1.apply(new Too(),"123")); 85 System.out.println(biFunction2.apply(new Too(),"123")); 86 /** 87 * 構造方法的引用 88 * 定義:如果函數式接口的實現恰好可以通過調用一個類的構造方法來實現,那麽就可以使用構造方法引用 89 * 語法格式- - 類名::new 90 */ 91 Supplier<Person> s2 = () -> new Person(); 92 s2.get(); 93 Supplier<Person> s3 = Person::new; 94 s3.get(); 95 //含有無參構造函數都可以使用Supplier,如下: 96 Supplier<List> s4 = ArrayList::new; 97 Supplier<Thread> s5 = Thread::new; 98 Supplier<Set> s6 = HashSet::new; 99 Supplier<String> s7 = String::new; 100 101 //含有有參構造函數的 102 Consumer<Integer> c6 = Account::new; 103 c6.accept(123); 104 105 Function<String, Integer> f2 = Integer::new; 106 System.out.println(f2.apply("456")); 107 108 ////////////////////// 方法的引用 - end //////////////////////// 109 110 ////////////////////// Stream API - start //////////////////////// 111 112 /*** 113 * stream的創建 114 * */ 115 //1、數組 116 String[] arr = {"1","b","c"}; 117 Integer[] arr1 = {1,2,3,4}; 118 Stream<String> stream1 = Stream.of(arr); 119 Stream<Integer> stream2 = Stream.of(arr1); 120 //2、集合 121 List<String> list1 = Arrays.asList("1","2","3"); 122 Stream<String> stream = list1.stream(); 123 124 /** 125 * 中間操作 126 * */ 127 Arrays.asList(1, 2, 3, 4, 5, 6).stream().filter(x -> x % 2 == 0).forEach(System.out::println); 128 int max = Arrays.asList(1, 2, 3, 4, 5, 6).stream().max((a1,b1) -> a1-b1).get(); 129 System.out.println(max); 130 Integer min = Arrays.asList(1, 2, 3, 4, 5, 6).stream().min((a1, b1) -> a1 - b1).get(); 131 System.out.println(min); 132 //求集合元素數量 133 long count = Arrays.asList(1, 2, 3, 4, 5).stream().count(); 134 System.out.println(count); 135 //截取 136 Arrays.asList(1, 2, 3, 4, 5, 6).stream().limit(3).forEach(System.out::println); 137 //求平均值 138 double asDouble = Arrays.asList(1, 2, 3, 4, 5, 6).stream().mapToInt(x -> x).average().getAsDouble(); 139 System.out.println(asDouble); 140 //查找任意匹配的元素 141 Optional<Integer> first = Arrays.asList(1, 2, 3, 4, 5, 6).stream().filter(x -> x % 2 == 0).findAny(); 142 System.out.println(first.get()); 143 //查找第一個匹配的元素 144 Optional<Integer> first1 = Arrays.asList(1, 2, 3, 4, 5, 6).stream().filter(x -> x % 2 == 0).sorted((a,b) -> b -a).findFirst(); 145 System.out.println(first1.get()); 146 //從1-50裏面的所有偶數找出來,放到一個list中 147 List<Integer> list2 = Stream.iterate(1, x -> x + 1).limit(50).filter(n -> n % 2 == 0).collect(Collectors.toList()); 148 list2.forEach(System.out::println); 149 //集合元素去重 150 Arrays.asList(1,2,3,4,5,4,3,5,6,7,3,8).stream().distinct().forEach(System.out::println); 151 //將流轉成set集合 152 Set<Integer> collect2 = Arrays.asList(1, 2, 3, 4, 5, 4, 3, 5, 6, 7, 3, 8).stream().collect(Collectors.toSet()); 153 System.out.println(collect2); 154 //從1-50裏面的所有偶數找出來,忽略前10個,放到一個list中 155 List<Integer> list3 = Stream.iterate(1, x -> x + 1).limit(50).filter(n -> n % 2 == 0).skip(10).collect(Collectors.toList()); 156 System.out.println(list3); 157 //類似分頁效果, skip(10).limit(10) :跳過前10條,相當於查詢第二頁,每頁10條 158 List<Integer> list4 = Stream.iterate(1, x -> x + 1).limit(50).sorted((a,b) -> b -a).skip(10).limit(10).collect(Collectors.toList()); 159 System.out.println(list4); 160 ////////////////////// Stream API - end //////////////////////// 161 } 162 163 String put1(){ 164 return "world"; 165 } 166 167 static String put(){ 168 return "hello"; 169 } 170 171 void consume1(String string){ 172 System.out.println(string + ", 哈哈哈"); 173 } 174 static void consume(String string){ 175 System.out.println(string + ", 哈哈哈"); 176 } 177 static String convertUp(String a){ 178 return a.toUpperCase(); 179 } 180 static Integer getLength(String a, String b){ 181 return a.length() + b.length(); 182 } 183 } 184 185 class Account{ 186 public Account(int age){ 187 System.out.println(age); 188 } 189 } 190 191 class Person{ 192 public Person(){ 193 System.out.println("person 構造方法調用了"); 194 } 195 } 196 197 class Too{ 198 public void too(){ 199 System.out.println("invoke............."); 200 } 201 202 public void too1(String str){ 203 System.out.println(str + ",invoke............."); 204 } 205 206 public Integer too2(String p) { 207 return 1; 208 } 209 }

Lambda學習---方法引用和其他基本應用