免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
JavaSE23-函數(shù)式接口&Stream流
1.函數(shù)式接口
1.1 函數(shù)式接口概述
概念
有且僅有一個抽象方法的接口
如何檢測一個接口是不是函數(shù)式接口
@FunctionalInterface
放在接口定義的上方:如果接口是函數(shù)式接口,編譯通過;如果不是,編譯失敗
注意事項
我們自己定義函數(shù)式接口的時候,@FunctionalInterface是可選的,就算我不寫這個注解,只要保證滿足函數(shù)式接口定義的條件,也照樣是函數(shù)式接口。但是,建議加上該注解。
1.2 函數(shù)式接口作為方法的參數(shù)
1 public class RunnableDemo { 2 public static void main(String[] args) { 3 startRunnable(() -> { 4 System.out.println(Thread.currentThread().getName() "啟動了"); 5 }); 6 } 7 8 private static void startRunnable(Runnable r) { 9 new Thread(r).start();10 }11 }
在Runnable中有如下定義
1 @FunctionalInterface 2 public interface Runnable { 3 /** 4 * When an object implementing interface {@code Runnable} is used 5 * to create a thread, starting the thread causes the object's 6 * {@code run} method to be called in that separately executing 7 * thread. 8 * <p> 9 * The general contract of the method {@code run} is that it may10 * take any action whatsoever.11 *12 * @see java.lang.Thread#run()13 */14 public abstract void run();15 }1.3 函數(shù)式接口作為方法的返回值
1 import java.sql.Connection; 2 import java.util.ArrayList; 3 import java.util.Collection; 4 import java.util.Collections; 5 import java.util.Comparator; 6 7 public class getComparetorDemo { 8 public static void main(String[] args) { 9 ArrayList<String> list = new ArrayList<>();10 list.add("aaa");11 list.add("b");12 list.add("dd");13 list.add("cccc");14 15 System.out.println("排序前:" list);16 17 Collections.sort(list,getComparetor());18 19 System.out.println("排序后:" list);20 }21 22 private static Comparator<String> getComparetor() {23 return (s1,s2) -> s1.length() - s2.length();24 }25 }1.4 常用函數(shù)式接口之Supplier
Supplier接口
Supplier接口也被稱為生產(chǎn)型接口,如果我們指定了接口的泛型是什么類型,那么接口中的get方法就會生產(chǎn)什么類型的數(shù)據(jù)供我們使用。
構(gòu)造方法
方法名說明
T get()按照某種實現(xiàn)邏輯(由Lambda表達式實現(xiàn))返回一個數(shù)據(jù)
返回字符串
1 import java.util.function.Supplier; 2 3 public class SupplierDemo { 4 public static void main(String[] args) { 5 System.out.println(useSup( 6 () -> "hello world" 7 )); 8 } 9 10 private static String useSup(Supplier<String> sup) {11 return sup.get();12 }13 }
返回最大值
1 import java.util.function.Supplier; 2 3 public class SupplierDemo2 { 4 public static void main(String[] args) { 5 int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 21, 142, 11, 2241, 24}; 6 int maxValue = useSup(() -> { 7 int max = arr[0]; 8 9 for (int i = 0; i < arr.length; i ) {10 if (max < arr[i]) {11 max = arr[i];12 }13 }14 15 return max;16 });17 18 System.out.println(maxValue);19 }20 21 private static Integer useSup(Supplier<Integer> sup) {22 return sup.get();23 }24 }?1.5 常用函數(shù)式接口之Consumer
Consumer接口
Consumer接口也被稱為消費型接口,它消費的數(shù)據(jù)的數(shù)據(jù)類型由泛型指定
常用方法
方法名說明
void accept(T t)對給定的參數(shù)執(zhí)行此操作
default Consumer andThen(Consumer after)返回一個組合的Consumer,依次執(zhí)行此操作,然后執(zhí)行after操作
1 import java.util.function.Consumer; 2 3 public class ConsumerDemo { 4 public static void main(String[] args) { 5 String[] list = {"1,綠巨人","2,鋼鐵俠","3,美國隊長"}; 6 7 printinfo(list,str -> System.out.print("序號" str.split(",")[0]),str -> System.out.println(str.split(",")[1])); 8 } 9 10 public static void printinfo(String[] list, Consumer<String> con1,Consumer<String> con2){11 for (String s : list){12 con1.andThen(con2).accept(s);13 }14 }15 }1.6 常用函數(shù)式接口之Predicate
Predicate接口
Predicate接口通常用于判斷參數(shù)是否滿足指定的條件
方法名說明
boolean test(T t)對給定的參數(shù)進行判斷(判斷邏輯由Lambda表達式實現(xiàn)),返回 一個布爾值
default Predicate negate()返回一個邏輯的否定,對應(yīng)邏輯非
default Predicate and(Predicate other)返回一個組合判斷,對應(yīng)短路與
default Predicate or(Predicate other)返回一個組合判斷,對應(yīng)短路或
1 import java.util.function.Predicate; 2 3 public class PredicateDemo { 4 public static void main(String[] args) { 5 boolean a = check("hello world",s -> s.length()<5); 6 System.out.println(a); 7 8 boolean b = uncheck("hello world",s -> s.length()<5); 9 System.out.println(b);10 }11 12 private static boolean check(String s , Predicate<String> pre){13 return pre.test(s);14 }15 16 private static boolean uncheck(String s , Predicate<String> pre){17 return pre.negate().test(s);18 }19 }?1.7 常用函數(shù)式接口之Function
Function接口
Function<t,r>接口通常用于對參數(shù)進行處理,轉(zhuǎn)換(處理邏輯由Lambda表達式實現(xiàn)),然后返回一個新的值
方法名說明
R apply(T t)將此函數(shù)應(yīng)用于給定的參數(shù)
default Function andThen(Function after)返回一個組合函數(shù),首先將該函數(shù)應(yīng)用于輸入,然后將after函數(shù)應(yīng)用于結(jié)果
1 import java.util.function.Function; 2 3 public class FunctionDemo { 4 public static void main(String[] args) { 5 parseint("13729",s -> Integer.parseInt(s)); 6 } 7 8 private static void parseint(String s, Function<String,Integer> fun) { 9 int i = fun.apply(s);10 System.out.println(i);11 }12 }2.Strem流
2.1 體驗Stream流
1 import java.util.ArrayList; 2 3 public class FilterDemo { 4 public static void main(String[] args) {//將姓張且名字在兩個字(不含兩個)以上的名字加入另一個集合 5 ArrayList<String> names = new ArrayList<>(); 6 7 names.add("張無忌"); 8 names.add("趙敏"); 9 names.add("張三豐");10 names.add("張果老");11 names.add("張國立");12 names.add("鐵拐李");13 names.add("張赫");14 names.add("張飛");15 names.add("張翼德");16 names.add("劉備");17 names.add("關(guān)云長");18 names.add("曹孟德");19 names.add("呂輕侯");20 21 ArrayList<String> zhanglist = new ArrayList<>();22 23 names.stream().filter(s -> s.startsWith("張")).filter(s -> s.length() >=3).forEach(System.out::println);24 }25 }
Stream流的好處
直接閱讀代碼的字面意思即可完美展示無關(guān)邏輯方式的語義:獲取流、過濾姓張、過濾長度為3、逐一打印
Stream流把真正的函數(shù)式編程風格引入到Java中
2.2 Stream流的常見生成方式
生成Stream流的方式
Collection體系集合
使用默認方法stream()生成流, default Stream stream()
Map體系集合
把Map轉(zhuǎn)成Set集合,間接的生成流
數(shù)組
通過Stream接口的靜態(tài)方法of(T... values)生成流
1 import java.util.*; 2 import java.util.stream.Stream; 3 4 public class CreateStream { 5 public static void main(String[] args) { 6 //Collection體系直接使用stream() 7 List<String> list = new ArrayList<>(); 8 Stream<String> listStream = list.stream(); 9 10 Set<String> set = new TreeSet<>();11 Stream<String> setStream = set.stream();12 //Map體系間接生成13 Map<String,Integer> map = new HashMap<>();14 Stream<String> keyStream = map.keySet().stream();15 Stream<Integer> valueStream = map.values().stream();16 17 Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();18 //數(shù)組使用Stream接口的of()19 String[] nums = {"1","2","3","4"};20 Stream<String> numStringStream = Stream.of(nums);21 Stream<Integer> numStram = Stream.of(1,2,3,4,5);22 }23 }2.3 Stream流中間操作方法
概念
中間操作的意思是,執(zhí)行完此方法之后,Stream流依然可以繼續(xù)執(zhí)行其他操作。
常用方法
方法名說明
Stream filter(Predicate predicate)用于對流中的數(shù)據(jù)進行過濾
Stream limit(long maxSize)返回此流中的元素組成的流,截取前指定參數(shù)個數(shù)的數(shù)據(jù)
Stream skip(long n)跳過指定參數(shù)個數(shù)的數(shù)據(jù),返回由該流的剩余元素組成的流
static Stream concat(Stream a, Stream b)合并a和b兩個流為一個流
Stream distinct()返回由該流的不同元素(根據(jù)Object.equals(Object) )組成的流
Stream sorted()返回由此流的元素組成的流,根據(jù)自然順序排序
Stream sorted(Comparator comparator)返回由該流的元素組成的流,根據(jù)提供的Comparator進行排序
Stream map(Function mapper)返回由給定函數(shù)應(yīng)用于此流的元素的結(jié)果組成的流
IntStream mapToInt(ToIntFunction mapper)返回一個IntStream其中包含將給定函數(shù)應(yīng)用于此流的元素的結(jié)果
limit&skip
1 import java.util.ArrayList; 2 3 public class limitandskipDemo { 4 public static void main(String[] args) { 5 ArrayList<String> names = new ArrayList<>(); 6 7 names.add("張無忌"); 8 names.add("趙敏"); 9 names.add("張三豐");10 names.add("張果老");11 names.add("張國立");12 names.add("鐵拐李");13 names.add("張赫");14 names.add("張飛");15 names.add("張翼德");16 names.add("劉備");17 names.add("關(guān)云長");18 names.add("曹孟德");19 names.add("呂輕侯");20 21 //輸出前三個22 names.stream().limit(3).forEach(System.out::println);23 System.out.println("-------");24 //跳過三個然后輸出25 names.stream().skip(3).forEach(System.out::println);26 System.out.println("-------");27 //跳過四個輸出五個28 names.stream().skip(4).limit(5).forEach(System.out::println);29 }30 }
concat&distinct
1 import java.util.ArrayList; 2 import java.util.stream.Stream; 3 4 public class concatanddistinctDemo { 5 public static void main(String[] args) { 6 ArrayList<String> names = new ArrayList<>(); 7 names.add("張無忌"); 8 names.add("趙敏"); 9 names.add("張三豐");10 names.add("張果老");11 names.add("張國立");12 names.add("鐵拐李");13 14 //截取前四個為流s115 Stream<String> s1 = names.stream().limit(4);16 //跳過前兩個為流s217 Stream<String> s2 = names.stream().skip(2);18 //合并s1,s219 // Stream.concat(s1, s2).forEach(System.out::println);20 //合并并去重21 Stream.concat(s1, s2).distinct().forEach(System.out::println);22 }23 }
sort
1 import java.util.ArrayList; 2 3 public class sortDemo { 4 public static void main(String[] args) { 5 ArrayList<String> names = new ArrayList<>(); 6 names.add("張無忌"); 7 names.add("趙敏"); 8 names.add("張三豐"); 9 names.add("張果老");10 names.add("張國立");11 names.add("鐵拐李");12 13 names.stream().sorted((s1,s2) -> {14 int num = s1.length()-s2.length();15 int num2 = num == 0 ? s2.compareTo(s1) : num;16 return num2;17 }).forEach(System.out::println);18 }19 }
maptoInt
1 import java.util.ArrayList; 2 3 public class maptointDemo { 4 public static void main(String[] args) { 5 ArrayList<String> nums = new ArrayList<>(); 6 nums.add("1"); 7 nums.add("10"); 8 nums.add("100"); 9 nums.add("1000");10 nums.add("10000");11 nums.add("100000");12 13 int result = nums.stream().mapToInt(Integer::parseInt).sum();14 System.out.println(result);15 }16 }
count
1 import java.util.ArrayList; 2 3 public class countDemo { 4 public static void main(String[] args) { 5 ArrayList<String> names = new ArrayList<>(); 6 7 names.add("張無忌"); 8 names.add("趙敏"); 9 names.add("張三豐");10 names.add("張果老");11 names.add("張國立");12 names.add("鐵拐李");13 names.add("張赫");14 names.add("張飛");15 names.add("張翼德");16 names.add("劉備");17 names.add("關(guān)云長");18 names.add("曹孟德");19 names.add("呂輕侯");20 21 long count = names.stream().filter(s -> s.startsWith("張")).count();22 System.out.println(count);23 }24 }
練習
這里有兩個集合,有6個男演員和6個女演員,要求:
男演員只要名字為3個字的前三人
女演員只要姓林的,并且不要第一個
把過濾后的男演員姓名和女演員姓名合并到一起
把上一步操作后的元素作為構(gòu)造方法的參數(shù)創(chuàng)建演員對象,遍歷數(shù)據(jù)
Actor類
1 public class Actor { 2 private String name; 3 4 public Actor(String name) { 5 this.name = name; 6 } 7 8 public String getName() { 9 return name;10 }11 12 public void setName(String name) {13 this.name = name;14 }15 }
實現(xiàn)類
1 import java.util.ArrayList; 2 import java.util.stream.Stream; 3 4 public class ActorControl { 5 public static void main(String[] args) { 6 ArrayList<String> man = new ArrayList<>(); 7 ArrayList<String> woman = new ArrayList<>(); 8 9 man.add("劉德華");10 man.add("成龍");11 man.add("周星馳");12 man.add("周潤發(fā)");13 man.add("李小龍");14 man.add("林正英");15 16 woman.add("林青霞");17 woman.add("關(guān)之琳");18 woman.add("朱茵");19 woman.add("林志玲");20 woman.add("林心如");21 woman.add("王祖賢");22 23 //男演員只要名字為3個字的前三人24 Stream<String> manStream = man.stream().filter(s -> s.length() == 3).limit(3);25 //女演員只要姓林的,并且不要第一個26 Stream<String> womanStream = woman.stream().filter(s -> s.startsWith("林")).skip(1);27 //把過濾后的男演員姓名和女演員姓名合并到一起28 Stream<String> stream = Stream.concat(manStream, womanStream);29 //把上一步操作后的元素作為構(gòu)造方法的參數(shù)創(chuàng)建演員對象,遍歷數(shù)據(jù)30 stream.map(Actor::new).forEach(s -> System.out.println(s.getName()));31 }32 }
或者更簡便的寫法
1 import java.util.ArrayList; 2 import java.util.stream.Stream; 3 4 public class ActorControl { 5 public static void main(String[] args) { 6 ArrayList<String> man = new ArrayList<>(); 7 ArrayList<String> woman = new ArrayList<>(); 8 9 man.add("劉德華");10 man.add("成龍");11 man.add("周星馳");12 man.add("周潤發(fā)");13 man.add("李小龍");14 man.add("林正英");15 16 woman.add("林青霞");17 woman.add("關(guān)之琳");18 woman.add("朱茵");19 woman.add("林志玲");20 woman.add("林心如");21 woman.add("王祖賢");22 23 Stream.concat(man.stream().filter(s -> s.length() == 3).limit(3),woman.stream().filter(s -> s.startsWith("林")).skip(1)).map(Actor::new).forEach(s -> System.out.println(s.getName()));24 }25 }2.4 Stream流的收集操作
概念
對數(shù)據(jù)使用Stream流的方式操作完畢后,可以把流中的數(shù)據(jù)收集到集合中。
常用方法
方法名說明
R collect(Collector collector)把結(jié)果收集到集合中
工具類Collectors提供了具體的收集方式
方法名說明
public static Collector toList()把元素收集到List集合中
public static Collector toSet()把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper)把元素收集到Map集合中
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Map; 4 import java.util.Set; 5 import java.util.stream.Collectors; 6 import java.util.stream.Stream; 7 8 public class CollectorsDemo { 9 public static void main(String[] args) {10 List<String> names = new ArrayList<>();11 names.add("張無忌");12 names.add("趙敏");13 names.add("張三豐");14 names.add("張果老");15 names.add("張國立");16 names.add("鐵拐李");17 names.add("張赫");18 names.add("張飛");19 Stream<String> nameStream = names.stream().filter(s -> s.length()==3);20 List<String> threeWordsNames = nameStream.collect(Collectors.toList());21 for (String s : threeWordsNames){22 System.out.println(s);23 }24 System.out.println("------");25 Stream<String> namesStreams = names.stream().filter(s ->s.startsWith("張"));26 Set<String> threeNames = namesStreams.collect(Collectors.toSet());27 for (String sm : threeNames){28 System.out.println(sm);29 }30 System.out.println("------");31 String[] strArray = {"1,張曼玉","2,林青霞","3,朱茵"};32 Stream<String> strStream = Stream.of(strArray);33 Map<String,String> bf = strStream.collect(Collectors.toMap(s -> s.split(",")[0],s -> s.split(",")[1]));34 Set<String> keys = bf.keySet();35 for (String key : keys){36 String value = bf.get(key);37 System.out.println(value);38 }39 }40 }
來源:https://www.icode9.com/content-1-774751.html
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java進階 之 Stream流
Java8中的Stream,一行代碼,讓集合操作飛起來!
感受lambda之美
Stream流
采用java8 lambda表達式 實現(xiàn) java list 交集 并集 差集 去重復(fù)并集
Java基礎(chǔ)之Java8中map和flatMap的使用
更多類似文章 >>
生活服務(wù)
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服