編寫(xiě):bravo1988

校審:養(yǎng)兔子的大叔

一個(gè)需求List<Person> list = new ArrayList<>();
list.add(new Person(&#34;李健&#34;, 46));
list.add(new Person(&#3" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢 在線咨詢
18143453325 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷(xiāo)資訊 > 網(wǎng)站運(yùn)營(yíng) > 山寨Stream API

山寨Stream API

時(shí)間:2023-04-24 11:09:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-04-24 11:09:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)

山寨Stream API:摘自《Java中級(jí)路線》的Java8新特性一章。

編寫(xiě):bravo1988

校審:養(yǎng)兔子的大叔

一個(gè)需求

List<Person> list = new ArrayList<>();
list.add(new Person("李健", 46));
list.add(new Person("周深", 28));
list.add(new Person("張學(xué)友", 59));

請(qǐng)篩選出年齡大于40的歌手的名字
請(qǐng)大家先自行實(shí)現(xiàn)這個(gè)需求。

我的實(shí)現(xiàn)方式

我寫(xiě)了一個(gè)山寨版的Stream API,當(dāng)然,只實(shí)現(xiàn)了filter()和map()。

乍一看很麻煩,好像還不如你們寫(xiě)的各種for,但我是為了復(fù)用,所以抽取了MyList。

要想實(shí)現(xiàn)上面的編碼形式,需要兩塊磚:

關(guān)于Lambda表達(dá)式,請(qǐng)參考Lambda表達(dá)式。

鏈?zhǔn)骄幊毯?jiǎn)單來(lái)說(shuō)就是一個(gè)方法返回引用本身:

public class ChainCall { public static void main(String[] args) { Person bravo1988 = new Person().setName("bravo1988").setAge(18).setMoney(1000.0); }}class Person { private String name; private Integer age; private Double money; public String getName() { return name; } public Integer getAge() { return age; } public Double getMoney() { return money; } public Person setName(String name) { this.name = name; return this; } public Person setAge(Integer age) { this.age = age; return this; } public Person setMoney(Double money) { this.money = money; return this; }}


OK,交代完畢,接下來(lái)請(qǐng)大家把我的代碼拷貝到SpringBoot項(xiàng)目中運(yùn)行看看:

/** * @author bravo * @date 2020-03-19 17:55 */public class MockStream { public static void main(String[] args) throws JsonProcessingException { MyList<Person> personMyList = new MyList<>(); personMyList.add(new Person("李健", 46)); personMyList.add(new Person("周深", 28)); personMyList.add(new Person("張學(xué)友", 59)); // 需求:過(guò)濾出年齡大于40的歌手的名字 MyList<String> result = personMyList.filter(person -> person.getAge() > 40).map(person -> person.getName()); prettyPrint(result.getList()); System.out.println("/n---------------------------------------------/n"); // 對(duì)比真正的Stream API List<Person> list = new ArrayList<>(); list.add(new Person("李健", 46)); list.add(new Person("周深", 28)); list.add(new Person("張學(xué)友", 59)); List<String> collect = list.stream().filter(person -> person.getAge() > 40).map(person -> person.getName()).collect(Collectors.toList()); prettyPrint(collect); } /** * 按JSON格式輸出 * * @param obj * @throws JsonProcessingException */ private static void prettyPrint(Object obj) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); String s = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); System.out.println(s); }}@Data@AllArgsConstructorclass Person { private String name; private Integer age;}@Getterclass MyList<T> { private List<T> list = new ArrayList<>(); public boolean add(T t) { return list.add(t); } /** * 給MyList傳遞具體的判斷規(guī)則,然后MyList把內(nèi)部現(xiàn)有符合判斷(true)的元素集返回 * @param predicate * @return */ public MyList<T> filter(Predicate<T> predicate){ MyList<T> filteredList = new MyList<>(); for (T t : list) { if (predicate.test(t)) { // 收集判斷為true的元素 filteredList.add(t); } } return filteredList; } /** * 把MyList中的List<T>轉(zhuǎn)為L(zhǎng)ist<R> * * @param mapper * @param <R> * @return */ public <R> MyList<R> map(Function<T, R> mapper) { MyList<R> mappedList = new MyList<>(); for (T t : list) { mappedList.add(mapper.apply(t)); } return mappedList; }}/** * 定義一個(gè)Predicate接口,名字無(wú)所謂 * * @param <T> */@FunctionalInterfaceinterface Predicate<T> { /** * 定義了一個(gè)test()方法,傳入任意對(duì)象,返回true or false,具體判斷邏輯由子類(lèi)實(shí)現(xiàn) * * @param t * @return */ boolean test(T t);}/** * 定義一個(gè)Function接口,名字無(wú)所謂 * * @param <E> * @param <R> */@FunctionalInterfaceinterface Function<E, R> { /** * 定義一個(gè)apply()方法,接收一個(gè)E返回一個(gè)R。也就是把E映射成R * * @param e * @return */ R apply(E e);}看不懂沒(méi)關(guān)系,感受一下即可。

下一篇會(huì)帶著大家一步步分析上面的代碼是怎么寫(xiě)出來(lái)的。

正所謂畫(huà)龍畫(huà)虎難畫(huà)骨,山寨Stream API畢竟只是山寨版。

MyList雖然很像Stream API,但本質(zhì)還是對(duì)List進(jìn)行外部迭代,而正版的Stream API是先產(chǎn)生Stream流,再通過(guò)流迭代,屬于內(nèi)部迭代。兩者其實(shí)存在本質(zhì)區(qū)別。

有興趣可以了解一下:Java8內(nèi)部迭代與外部迭代

本文只是借助這個(gè)例子切入Stream API的學(xué)習(xí),你們也不可能在實(shí)際項(xiàng)目中放著正版Stream API不用,而拷貝我的山寨版。

關(guān)鍵詞:山寨

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉