最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

2.Stream流學(xué)習(xí)加案例演示

2023-06-08 09:19 作者:隔壁小黃不禿頭  | 我要投稿


2.2概念

它可以被用來(lái)對(duì)集合或數(shù)組進(jìn)行鏈狀流式的操作。方便對(duì)集合或數(shù)組操作

2.3 常用操作

2.3.1 創(chuàng)建流

collection集合創(chuàng)建

單例集合: 集合對(duì)象.strerm()

@Test
public void collectList(){
? ?Stream<Book> stream = getBookList().stream();
? ?stream.forEach(book -> System.out.println(book));
}

雙例集合:轉(zhuǎn)換成單例集合再創(chuàng)建

?@Test
? ?public void collectMap(){
? ? ? ?HashMap<Long, Book> map = new HashMap<>();
? ? ? ?getBookList().stream().forEach(book -> {
? ? ? ? ? ?map.put(book.getId(),book);
? ? ? ?});
? ? ? ?//轉(zhuǎn)為單例集合
? ? ? ?Set<Map.Entry<Long, Book>> entries = map.entrySet();
? ? ? ?entries.stream().forEach(System.out::println);
? ?}

數(shù)組創(chuàng)建

數(shù)組:Arrays.stream(數(shù)組) 或 Stream.of(數(shù)組)來(lái)操作

注意:Arrays.stream方法生成流是數(shù)值流,不是Stream

? ?@Test
? ?public void ?arrCreate(){
? ? ? ?System.out.println("-------Arrays.stream-------");
? ? ? ?Integer [] arr={1,2,3,4,5,6};
? ? ? ?Stream<Integer> stream = Arrays.stream(arr);
? ? ? ?stream.forEach(System.out::print);
? ? ? ?System.out.println('\n'+"-------Stream.of-------");
? ? ? ?Stream.of(arr).forEach(arrs-> System.out.print(arrs));
? ?}

Stream創(chuàng)建

//Stream創(chuàng)建
@Test
public void streamCreate(){
? ?Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
? ?stream.forEach(System.out::print);
}

2.3.2 中間操作

filter

對(duì)流中的元素進(jìn)行條件過(guò)濾

例如:過(guò)濾書名為‘小黃歷險(xiǎn)記’的書本,并打印出來(lái)

使用匿名內(nèi)部類調(diào)用

? ?@Test
? ?void middleFilter(){
? ? ? ?//過(guò)濾書名為‘小黃歷險(xiǎn)記’的書本 alt+enter 轉(zhuǎn)為lambda形式
? ? ? getBookList().stream().filter(new Predicate<Book>() {
? ? ? ? ? @Override
? ? ? ? ? public boolean test(Book book) {
? ? ? ? ? ? ? return !book.getName().equals("小黃歷險(xiǎn)記");
? ? ? ? ? }
? ? ? }).forEach(book -> System.out.println(book));
? }

轉(zhuǎn)為lambda形式

@Test
void middleFilter(){
? ? //過(guò)濾書名為‘小黃歷險(xiǎn)記’的書本 alt+enter 轉(zhuǎn)為lambda形式
? ?getBookList().stream()
? ? ? ? ? ?.filter(book -> !book.getName().equals("小黃歷險(xiǎn)記"))
? ? ? ? ? ?.forEach(book -> System.out.println(book));
}

map

可以對(duì)流中的元素進(jìn)行計(jì)算或轉(zhuǎn)換

例如:返回所有的書籍作家列表并去重輸出

? @Test
? ?void middleMap(){
? ? ? ?//返回所有的書籍作家列表并去重輸出
? ? ? List<String> authorNameList = getBookAuthorList().stream().map(new Function<Book, String>() {
? ? ? ? ? @Override
? ? ? ? ? public String apply(Book book) {
? ? ? ? ? ? ? return book.getAuthor().getName();
? ? ? ? ? }
? ? ? }).distinct().collect(Collectors.toList()); ?//去重并轉(zhuǎn)為list
? ? ? //遍歷輸出
? ? ? authorNameList.forEach(System.out::println);
? }

dsitinct

去重

例如:返回所有的書籍作家列表并去重輸出

? ?@Test
? ?void middleDistinct(){
? ? ? ?//返回所有的書籍作家列表并去重輸出
? ? ?getBookAuthorList().stream()
? ? ? ? ? ? ? .map(book -> book.getAuthor().getName())
? ? ? ? ? ? ?.distinct().forEach(System.out::println);
? ?}

sorted

排序

例如:對(duì)書籍價(jià)格降序排序并輸出

? ?@Test
? ?void middleSorted(){
? ? ? ?//對(duì)書籍價(jià)格降序排序并輸出
? ? ? ?getBookList().stream()
? ? ? ? ? ? ? ?.sorted(new Comparator<Book>() {
? ? ? ? ? ? ? ? ? ?@Override
? ? ? ? ? ? ? ? ? ?public int compare(Book o1, Book o2) {
? ? ? ? ? ? ? ? ? ? ? ?return (int)(o1.getPrice()-o2.getPrice());
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?}).forEach(book -> System.out.println(book));
? ?}

注意:調(diào)用空參的sorted()方法,需要流中的元素實(shí)現(xiàn)Comparable

limit

設(shè)置流的最長(zhǎng)長(zhǎng)度

例如:輸出三條書籍?dāng)?shù)據(jù)

? ?@Test
? ?void middleLimit(){
? ? ? ?//輸出三條書籍?dāng)?shù)據(jù)
? ? ? ?getBookList().stream()
? ? ? ? ? ? ? ?.limit(3)
? ? ? ? ? ? ? ?.forEach(System.out::println);
? ?}

skinp

扔掉前n個(gè)流內(nèi)容

例如:

輸出去掉書籍前2個(gè)的列表

? ?@Test
? ?void middleSkinp(){
? ? ? ?//輸出去掉書籍前2個(gè)的列表
? ? ? ?getBookList().stream()
? ? ? ? ? ? ? ?.skip(2)
? ? ? ? ? ? ? ?.forEach(System.out::println);
? ?}

flatMap

把一個(gè)對(duì)象轉(zhuǎn)換成多個(gè)對(duì)象作為流中的元素

例1:

輸出所有書籍的全部粉絲并去重

?@Test
? ?void middleFlagMap(){
? ? ? ?輸出所有書籍的全部粉絲并去重
? ? ? ?getBookFansList().stream()
? ? ? ? ? ? ? ?.flatMap(new Function<Book, Stream<Fans>>() {
? ? ? ? ? ? ? ? ? ?@Override
? ? ? ? ? ? ? ? ? ?public Stream<Fans> apply(Book book) {
? ? ? ? ? ? ? ? ? ? ? ?return book.getFans().stream();
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?}).distinct().forEach(fans -> System.out.println(fans));
? ?}

peek

遍歷處理

? ?//對(duì)書籍所有價(jià)格增加100
? ?getBookList().stream()
? ? ? ? ? ?.peek(new Consumer<Book>() {
? ? ? ? ? ? ? ?@Override
? ? ? ? ? ? ? ?public void accept(Book book) {
? ? ? ? ? ? ? ? ? ?book.setPrice(book.getPrice()+100.0);
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}).forEach(book -> System.out.println(book));
}

2.4 終結(jié)操作

forEach

遍歷

例子:輸出所有書籍的書名

? @Test
? ?public void finalForEach(){
? ? ? ?//輸出所有書籍的書名
? ? ? ?getBookList().stream()
? ? ? ? ? ? ? ?.distinct()
? ? ? ? ? ? ? ?.forEach(book -> System.out.println(book.getName()));
? ?}

count

計(jì)算流個(gè)數(shù)

例子:輸出書籍所有粉絲的數(shù)量并去重

? ?@Test
? ?public void finalCount(){
? ? ? ?//輸出書籍所有粉絲的數(shù)量并去重
? ? ? ?long count = getBookFansList().stream()
? ? ? ? ? ? ? ?.flatMap(book -> book.getFans().stream())
? ? ? ? ? ? ? ?.distinct()
? ? ? ? ? ? ? ?.count();
? ? ? ?System.out.println(count);
? ?}

max&min

取流中最值

例子:分別獲取作家的所出書籍的最高分和最低分

? ? ? ?List<Author> authors = getAuthors();
? ? ? ?Optional<Integer> max = authors.stream()
? ? ? ? ? ? ? ?.flatMap(author -> author.getBooks().stream())
? ? ? ? ? ? ? ?.map(book -> book.getScore())
? ? ? ? ? ? ? ?.max((o1, o2) -> o2 - o1);

? ? ? ?Optional<Integer> min = authors.stream()
? ? ? ? ? ? ? ?.flatMap(author -> author.getBooks().stream())
? ? ? ? ? ? ? ?.map(book -> book.getScore())
? ? ? ? ? ? ? ?.min((o1, o2) -> o1 - o2);
? ? ? ?System.out.println(max.get()+"-"+min.get());

collect

把當(dāng)前流轉(zhuǎn)換成一個(gè)集合

toList

例子:獲取一個(gè)存放所有書籍的List集合

?@Test
? ?public void finalCollectList(){
? ? ? ?//獲取一個(gè)存放所有書籍的List集合
? ? ? ?List<Book> bookList = getBookList().stream()
? ? ? ? ? ? ? ?.collect(Collectors.toList());
? ? ? ?System.out.println(bookList);
? ?}

toSet

例子:獲取一個(gè)存放所有書籍的粉絲Set集合

@Test
? ?public void finalCollectSet(){
? ? ? ?//獲取一個(gè)存放所有書籍的粉絲Set集合
? ? ? ?Set<Fans> fansSet = getBookFansList().stream()
? ? ? ? ? ? ? ?.flatMap(book -> book.getFans().stream())
? ? ? ? ? ? ? ?.collect(Collectors.toSet());
? ? ? ?System.out.println(fansSet);
? ?}

toMap

例子:獲取一個(gè)Map集合,map的key為書名,value為L(zhǎng)ist<Fans>

? ?@Test
? ?public void finalCollectMap(){
? ? ? ?//獲取一個(gè)Map集合,map的key為書名,value為L(zhǎng)ist<Fans>
? ? ? ?//注意map中key是唯一的
? ? ? ?Map<String, List<Fans>> listMap = getBookFansList().stream()
? ? ? ? ? ? ? ?.collect(Collectors.toMap(new Function<Book, String>() {
? ? ? ? ? ? ? ? ? ?@Override
? ? ? ? ? ? ? ? ? ?public String apply(Book book) {
? ? ? ? ? ? ? ? ? ? ? ?return book.getName();
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?}, book -> book.getFans()));

// ? ? ? ?Map<String, List<Fans>> listMap = getBookFansList().stream()
// ? ? ? ? ? ? ? ?.collect(Collectors.toMap(book -> book.getName(), book -> book.getFans()));
? ? ? ?System.out.println(listMap);
? ?}

groupingBy

條件分組

例子:根據(jù)書籍類型進(jìn)行分組

@Test
public void finalCollectGroupingBy(){
? ?//根據(jù)書籍類型進(jìn)行分組
? ?Map<String, List<Book>> listMap = getBookList().stream()
? ? ? ? ? ?.collect(Collectors.groupingBy(book -> book.getType()));
? ?Set<Map.Entry<String, List<Book>>> entrySet = listMap.entrySet();
? ?entrySet.forEach(System.out::println);
}

counting

符合條件的總數(shù)

例子:查看書籍價(jià)格高于999的總數(shù)

@Test
public void finalCollectCounting (){
? ?//查看書籍價(jià)格高于999的總數(shù)
? ?Long count = getBookList().stream()
? ? ? ? ? ?.filter(book -> book.getPrice() > 999)
? ? ? ? ? ?.collect(Collectors.counting());
? ?System.out.println(count);
}

summingDouble

對(duì)結(jié)果求和

例子:求出書籍價(jià)格之和

@Test
public void finalCollectSummingDouble(){
? ?//求出書籍價(jià)格之和
? double price= getBookList().stream()
? ? ? ? ? ?.collect(Collectors.summingDouble(value -> value.getPrice()));
? ?System.out.println(price);
}

minBy

篩選元素中最小數(shù)

例子:查找出描述最少的書籍

@Test
public void finalCollectMinBy(){
? ?//查找出描述最少的書籍
? ?Book book = getBookList().stream()
? ? ? ? ? ?.collect(Collectors.minBy((o1, o2) -> o1.getDescription().length() - o2.getDescription().length())).get();
? ?System.out.println(book);
}

joining

以指定分隔符鏈接成字符串

例子:將書籍名字,以指定分隔符鏈接成字符串

@Test
public void ?finalCollectJoining(){
? ?//將書籍名字,以指定分隔符鏈接成字符串
? ?String bookNames = getBookList().stream()
? ? ? ? ? ?.map(book -> book.getName())
? ? ? ? ? ?.collect(Collectors.joining("-"));
? ?System.out.println(bookNames);

}

sum

求和

@Test
public void finalSum(){
? ?//求出書籍價(jià)格之和
? ?double priceSum = getBookList().stream()
? ? ? ? ? ?.mapToDouble(Book::getPrice).sum();
? ?System.out.println(priceSum);

}

min

求最小值

@Test
public void finalMin(){
? ?//求出書籍價(jià)格最低
? ?OptionalDouble min = getBookList().stream()
? ? ? ? ? ?.mapToDouble(Book::getPrice).min();
? ?System.out.println(min);
? ?double priceMin = min.getAsDouble();
? ?System.out.println(priceMin);
}

max

求最大值

@Test
public void finalMax(){
? ?//求出價(jià)格最高的書籍
? ?Optional<Book> max = getBookList().stream()
? ? ? ? ? ?.max(Comparator.comparing(book -> book.getPrice()));
? ?Double price = max.get().getPrice();
? ?System.out.println(price);
}

匹配

anyMatch

用來(lái)判是否至少匹配條件的一個(gè)元素,返回boolean類型

例子:判斷是否有價(jià)格高于999以上的

? ?@Test
? ?public void finalAnyMatch(){
? ? ? ?//判斷是否有價(jià)格高于999以上的書籍
? ? ? ?boolean b = getBookList().stream()
? ? ? ? ? ? ? ?.anyMatch(book -> book.getPrice() > 999);
? ? ? ?System.out.println(b);
? ?}

AllMatch

用來(lái)判斷是否都符合匹配條件,返回boolean類型

? @Test
? ?public void finalAllMatch(){
? ? ? ?//判斷價(jià)格是否都高于999以上的
? ? ? ?boolean b = getBookList().stream()
? ? ? ? ? ? ? ?.allMatch(book -> book.getPrice() > 999);
? ? ? ?System.out.println(b);
? ?}

noneMath

用來(lái)判斷是否都不符合匹配條件,返回boolean類型

? ?@Test
? ?public void finalNoneMatch(){
? ? ? ?//判斷價(jià)格是否都不高于999以上的
? ? ? ?boolean b = getBookList().stream()
? ? ? ? ? ? ? ?.noneMatch(book -> book.getPrice() > 999);
? ? ? ?System.out.println(b);
? ?}

查找

findAny

獲取流中的任意元素

例子:查找任意一個(gè)書籍粉絲大于1的書籍,存在則輸出書籍名字

? ?@Test
? ?public void finalFindAny(){
? ? ? ?//查找任意一個(gè)書籍粉絲大于1的書籍,存在則輸出書籍名字
? ? ? ?Optional<Book> bookOptional = getBookFansList().stream()
? ? ? ? ? ? ? ?.filter(book -> book.getFans().size() > 1)
? ? ? ? ? ? ? ?.findAny();
? ? ? ?//如果存在則輸出
? ? ? ?bookOptional.ifPresent(book -> System.out.println(book.getName()));
? ?}

findFirst

獲取流中的第一個(gè)元素

例子:獲取一個(gè)價(jià)格搞于999的書籍,并輸出該書籍名字和價(jià)格

? ?@Test
? ?public void finalFindFirst(){
? ? ? ?//獲取一個(gè)價(jià)格搞于999的書籍,并輸出該書籍名字和價(jià)格
? ? ? ? getBookList().stream()
? ? ? ? ? ? ? ? .filter(book -> book.getPrice()>999)
? ? ? ? ? ? ? ? .findFirst()
? ? ? ? ? ? ? ? .ifPresent(book -> System.out.println(book.getName()+"-"+book.getPrice()));
? ?}

reduce歸定

對(duì)流中的數(shù)據(jù)按照制定的計(jì)算方式計(jì)算出一個(gè)結(jié)果

內(nèi)部計(jì)算方式如下:

T reult=identity;
for (T element:this stream)
? ?result=accumulator.apply(result,element)
return result;

查找書籍價(jià)格最高

? ?@Test
? ?public void finalReduce(){
? ? ? ?//查找書籍價(jià)格最高
? ? ? ?Double reduce = getBookFansList().stream()
? ? ? ? ? ? ? ?.map(book -> book.getPrice())
? ? ? ? ? ? ? ?.reduce(0.0, (result, element) -> result + element);
? ? ? ?System.out.println(reduce);

? ?}

reduce一個(gè)參數(shù)的重載形式內(nèi)部的計(jì)算

查找價(jià)格最低的書籍

? ?@Test
? ?public void finalReduce02(){
? ? ? ?//查找價(jià)格最低的書籍
? ? ? ?Optional<Double> priceOptional = getBookFansList().stream()
? ? ? ? ? ? ? ?.map(book -> book.getPrice())
? ? ? ? ? ? ? ?.reduce(new BinaryOperator<Double>() {
? ? ? ? ? ? ? ? ? ?@Override
? ? ? ? ? ? ? ? ? ?public Double apply(Double finalPrice, Double price) {
? ? ? ? ? ? ? ? ? ? ? ?return finalPrice > price ? price : finalPrice;
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?});
? ? ? ?System.out.println(priceOptional.get());

? ?}


2.Stream流學(xué)習(xí)加案例演示的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
永昌县| 台前县| 延边| 深圳市| 龙山县| 讷河市| 太原市| 商丘市| 晋江市| 故城县| 施秉县| 昭苏县| 泉州市| 高淳县| 乐东| 会宁县| 新邵县| 湄潭县| 海淀区| 柳林县| 姜堰市| 麻栗坡县| 绥阳县| 连江县| 玉山县| 清河县| 兴文县| 景东| 肥城市| 东城区| 双牌县| 卫辉市| 紫阳县| 庆元县| 离岛区| 洪湖市| 名山县| 垫江县| 卫辉市| 北宁市| 周宁县|