日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

stream of java_Java 8 新特性-Stream更优雅的处理集合入门

發(fā)布時(shí)間:2024/9/27 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stream of java_Java 8 新特性-Stream更优雅的处理集合入门 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java 8 新特性之——Stream

一. 簡(jiǎn)單介紹

Stream是Java 8提出了的一種新的對(duì)集合對(duì)象功能的增強(qiáng)。它集合Lambda表達(dá)式,對(duì)集合提供了一些非常便利,高效的操作,使得代碼具有非常高的可讀性,優(yōu)雅性!!舉個(gè)例子來說,它就像一個(gè)流水線操作,對(duì)輸入流水線的東西(水果)進(jìn)行一系列加工處理,最后獲取到我們需要的某種特殊的水果(沒有洗過的蘋果)。

Stream提供了對(duì)集合的便捷化處理方式

聲明式編程的思想

代碼更加優(yōu)雅,簡(jiǎn)潔,不信往下看→_→

來個(gè)例子來看看Stream風(fēng)格

上海從今年7月1號(hào)開始,進(jìn)行了史無(wú)前例的垃圾分類,先看個(gè)圖圖,下圖是上海最近流行的挎包(捂臉笑哭),怕不怕,哈哈。

閑話不多說,進(jìn)入正題,現(xiàn)在需要將一堆垃圾List garbages分類處理。

使用了Stream的代碼風(fēng)格

//有一堆沒分類的垃圾

List garbage = new ArrayList<>();

//通過 Java 8 提供的流優(yōu)雅的處理下,瞧好嘍

List 干垃圾 = garbage.stream() //1. 垃圾倒出來,放到流水線

.filter(x -> "挑出有害垃圾") //2. 挑出有害垃圾

.filter(x -> "挑出可回收垃圾") //3. 挑出可回收垃圾

.filter(x -> "挑出有害垃圾") //4. 挑出有害垃圾

.collect(Collectors.toList()); //5. 把剩下的干垃圾裝到干垃圾桶

/** 上面是不是非常優(yōu)雅呢 **/

二. Stream 的操作流程

Stream的所有操作分為三個(gè)階段,【創(chuàng)建】>> 【中間操作】>> 【終端操作】

1. Stream 的【創(chuàng)建】

方式一

list.stream()

//通過List集合創(chuàng)建

List list = Arrays.asList("1", "2", "3");

//list.stream()

Stream stream = list.stream();

方式二

Stream.of()

//直接通過指定的元素創(chuàng)建

Stream stream = Stream.of("1", "2", "3");

//通過數(shù)組Array

String[] arrays = {"a", "b", "c"};

Stream stream = Stream.of(arrays);

//和上面區(qū)別不大

Stream stream1 = Arrays.stream(arrays);

其他

數(shù)值流的操作

對(duì)于基本數(shù)值型,目前有三種對(duì)應(yīng)的包裝類型 Stream:

IntStream.of(new int[]{1, 2, 3}).forEach(System.out::println);

IntStream.range(1, 3).forEach(System.out::println);

IntStream.rangeClosed(1, 3).forEach(System.out::println);

2. Stream的流水線操作【中間操作】

下面式常用的中間操作

Stream Operation

Goal

Input

filter

filter 方法用于通過設(shè)置的條件過濾出元素。

條件(返回布爾值)Predicate

map

map 方法用于映射每個(gè)元素到對(duì)應(yīng)的結(jié)果

可以是一個(gè)功能 Function

limit

limit 方法用于獲取指定數(shù)量的流

int值

sorted

sorted 方法用于對(duì)流進(jìn)行排序

Comparator

distinct

去除重復(fù)

--

parallel

parallelStream 是流并行處理程序的代替方法

--

filter統(tǒng)計(jì)空字符串的個(gè)數(shù)

Liststrings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

// 獲取空字符串的數(shù)量

int count = strings.stream().filter(string -> string.isEmpty()).count()

map 使用 map 輸出了元素對(duì)應(yīng)的平方數(shù)

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

// 獲取對(duì)應(yīng)的平方數(shù)

List squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

limit使用 limit 方法打印出 10 條數(shù)據(jù)

Random random = new Random();

random.ints().limit(10).forEach(System.out::println);

sorted使用 sorted 方法對(duì)輸出的 10 個(gè)隨機(jī)數(shù)進(jìn)行排序

Random random = new Random();

random.ints().limit(10).sorted().forEach(System.out::println);

distinct使用 distinct 對(duì)元素進(jìn)行去重

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

numbers.stream().distinct().forEach(System.out::println);

parallel 使用 parallelStream 來輸出空字符串的數(shù)量

List strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

// 獲取空字符串的數(shù)量

int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

3. 【終端操作】

Stream Operation

Goal

Input Or Output

forEach

遍歷元素

其他操作

count

統(tǒng)計(jì)元素個(gè)數(shù)

--

collect

聚合操作

--

forEach遍歷打印

Stream.of("a", "b", "c").forEach(System.out::println);

count統(tǒng)計(jì)'a'的數(shù)量

long count = Stream.of("a", "b", "c", "a").filter(x -> "a".equals(x)).count();//2

collect聚合

// 1. 聚合轉(zhuǎn)成List

List list1 = stream.collect(Collectors.toList());

List list2 = stream.collect(Collectors.toCollection(ArrayList::new));

// 2. 聚合轉(zhuǎn)成Set

Set set1 = stream.collect(Collectors.toSet());

Stack stack1 = stream.collect(Collectors.toCollection(Stack::new));

// 3. 聚合轉(zhuǎn)成String

String str = stream.collect(Collectors.joining()).toString();

// 4. ···其他

1. 循環(huán)list中的所有元素然后刪除重復(fù)

/**

* 循環(huán)list中的所有元素然后刪除重復(fù)

*

* @param list 待去重的list

* @return 去重后的list

*/

public static List removeDuplicate(List list) {

for (int i = 0; i < list.size() - 1; i++) {

for (int j = list.size() - 1; j > i; j--) {

if (list.get(j).getStaffNo().equals(list.get(i).getStaffNo())) {

list.remove(j);

}

}

}

return list;

}

2. 利用java8新特性去重參考原文鏈接

//list集合中根據(jù)userName去重

List lists = lists.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getUsrName))), ArrayList::new));

3. 排序 參考原文鏈接

List list = promotionBasicDao.

list(new WherePrams().orderBy("create_time desc"));

list = list.stream().sorted(Comparator.comparing(PromotionForHomeDto::getCreateTime))

.collect(Collectors.toList());

4. 分組

把一個(gè)集合分組(原來集合里的數(shù)據(jù)順序會(huì)打亂重排列)會(huì)默認(rèn)使用HashMap

List stus...;

Map> group = stus.stream().collect(Collectors.groupingBy(Student::getStudentNo));

解決辦法,使用LinkedHashMap分組按之前List的順序

List stus...;

Map> group = stus.stream().collect(Collectors.groupingBy(Student::getStudentNo, LinkedHashMap::new, Collectors.toList()));

實(shí)測(cè)例子:

public static void main(String[] args) {

List lists = new ArrayList<>();

lists.add("A");

lists.add("D");

lists.add("C");

lists.add("B");

lists.add("A");

System.out.println("原始列表數(shù)據(jù) :" + lists);

Map> collect1 = lists.stream().collect(Collectors.groupingBy(x -> x));

System.out.println("JAVA Stream分組處理完,默認(rèn)處理:" + collect1);

Map> collect = lists.stream().collect(Collectors.groupingBy(x -> x, LinkedHashMap::new, Collectors.toList()));

System.out.println("JAVA Stream分組處理完,LinkedHashMap:" + collect);

}

4. List轉(zhuǎn)Map

/*

* List -> Map

* 需要注意的是:

* toMap 如果集合對(duì)象有重復(fù)的key,會(huì)報(bào)錯(cuò)Duplicate key ....

* apple1,apple12的id都為1。

* 可以用 (o1,o2)->o1 來設(shè)置,如果有重復(fù)的key,則保留key1,舍棄key2

*/

Map collect2 = lists.stream().collect(Collectors.toMap(String::toLowerCase, x -> x + "測(cè)試", (o1, x2) -> o1));

System.out.println("List轉(zhuǎn)Map:" + collect2);

三. 簡(jiǎn)單說下聲明式編程

小故事:早上剛上班,經(jīng)理找到大胖說:“大胖啊,咱們下去去聚餐,軟件園旁邊有好幾家不錯(cuò)的餐館,如巫山烤魚、海底撈、大鴨梨,你到大眾點(diǎn)評(píng)調(diào)查一下,也問問去過的同事,看看哪家的口碑好。我們有14個(gè)人,預(yù)定一張大桌子,然后用滴滴約4輛車,每輛車坐3~4人,我們會(huì)在11點(diǎn)半出發(fā)”。

如果經(jīng)理是程序員,大胖是計(jì)算機(jī),這就是典型的命令式編程。

實(shí)際上,現(xiàn)實(shí)中一般是經(jīng)理對(duì)大胖說:“大胖啊,我給你交代一件事,咱們下午要聚餐,你在軟件園旁邊找一家合適的餐館,我們有14個(gè)人,11點(diǎn)半出發(fā)”。這種就是聲明式編程

1. 聲明式編程最知名的就是我們都熟悉的SQL

SELECT stu.id, stu.name, ss.score

FROM student stu, student_score ss

WHERE stu.id = ss.id

AND ss.score > 80

2. 用Java也來舉個(gè)例子

有一個(gè)學(xué)生列表,計(jì)算出年齡小于18歲的學(xué)生數(shù)量

傳統(tǒng)命令式編程

//聲明一個(gè)計(jì)數(shù)器,遍歷學(xué)生集合,如果學(xué)生年齡小于18歲,計(jì)數(shù)器+1

int count = 0;

Iterator iter = students.iterator();

while(iter.hasNext()) {

Student s = iter.next();

if (s.getAge < 18) {

count++;

}

}

聲明式編程

//過濾學(xué)生構(gòu)成的流(Stream),只把年齡小于18歲的留下,然后做個(gè)統(tǒng)計(jì)。

int count = students.stream()

.filter(s -> s.getAge() < 18)

.count();

聲明式編程也是一種高度的抽象,我只告訴你我要干什么,至于怎么干,我Don't care

總結(jié)

以上是生活随笔為你收集整理的stream of java_Java 8 新特性-Stream更优雅的处理集合入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。