欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

java8中Stream如何使用

java8中Stream如何使用,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

創(chuàng)新互聯(lián)建站主要企業(yè)基礎(chǔ)官網(wǎng)建設(shè),電商平臺建設(shè),移動手機平臺,微信平臺小程序開發(fā)等一系列專為中小企業(yè)按需策劃產(chǎn)品體系;應(yīng)對中小企業(yè)在互聯(lián)網(wǎng)運營的各種問題,為中小企業(yè)在互聯(lián)網(wǎng)的運營中保駕護(hù)航。

1.使用Stream

java8使用stream可以方便對數(shù)據(jù)集進(jìn)行各種處理,顯得程序不是那么冗余,Stream使用一般都包含這三個步驟。

  1. 定義一個數(shù)據(jù)源

  2. 定義中間操作形成流水線

  3. 定義終端操作,執(zhí)行流水線,生成計算結(jié)果

1.1 構(gòu)建流

Stream.of("tony","9527","952")
                .forEach(System.out::println);

 int[] nums = {1, 2, 3, 4, 100, 6};
 Arrays.stream(nums).sorted().forEach(System.out::println);

 Files.lines(Paths.get("/Users/1120291/Desktop/test.txt"))
 .forEach(System.out::println);

1.2 中間操作

1.2.1 filter

該操作接受一個返回boolean的函數(shù),當(dāng)返回false的元素將會被排除掉

class Person{
    private String name;
    private Integer age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}
public static List<Person> getPersonList(){
    List<Person> personList=new ArrayList<>();
    for(int i=0;i<10;i++){
        Person p=new Person();
        p.setName("test"+i);
        p.setAge(new Random().nextInt(50));
        personList.add(p);
    }
    return personList;
}
// filter過濾數(shù)據(jù)
List<Person> personList1 = getPersonList().stream().filter(person -> person.getAge() > 25)
        .collect(Collectors.toList());
personList1.stream().forEach(person -> {
    System.out.println(person);
});

1.2.2 distinct

去重操作

List<Integer> data = Stream.of(1, 7, 3, 8, 2, 4, 9, 7, 9)
        .distinct()
        .collect(Collectors.toList());

1.2.3 limit

該方法限制流只返回指定個數(shù)的元素,類似于sql中的limit

List<Integer> data = Stream.of(1, 7, 3, 8, 2, 4, 9, 7, 9)
        .limit(2)
        .collect(Collectors.toList());

1.2.4 skip

扔掉前指定個數(shù)的元素,配合limit使用可以達(dá)到翻頁的效果

List<Integer> data = Stream.of(1, 7, 3, 8, 2, 4, 9, 7, 9)
        .skip(3)
        .limit(2)
        .collect(Collectors.toList());

1.2.5 map

流中的每個元素都會應(yīng)用到這個函數(shù)上,返回的結(jié)果將形成新類型的流繼續(xù)后續(xù)操作,類似于scala的map

getPersonList().stream()
        .filter(customer -> customer.getAge() > 20)
        .map(person -> {
            return  person.getName();
        })
        .forEach(System.out::println);

在調(diào)用map之前流的類型是Stream<Person>,執(zhí)行完map之后的類型是Stream<String>

1.2.6 flatMap

flatMap類似于map,只不過是一對多,進(jìn)來一條返回多條。

getPersonList().stream().flatMap(person -> {
   return Stream.of(person.getName().split(","));
}).forEach(System.out::println);
//注意flatMap的返回類型要是Stream的
flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)

1.2.7 sorted

對所有的元素進(jìn)行排序

List<Integer> numbers = Arrays.asList(1, 7, 3, 8, 2, 4, 9);
numbers.stream().sorted(Integer::compareTo).forEach(System.out::println);

1.3 終端操作

終端操作會執(zhí)行所有的中間操作生成執(zhí)行的結(jié)果,執(zhí)行的結(jié)果不在是一個流。

1.3.1 anyMatch

如果流中有一個元素滿足條件將返回true

if (getPersonList().stream().anyMatch(person -> "test3".equals(person.getName()))) {
    System.out.println("test3");
}

1.3.2 allMatch

確保流中所有的元素都能滿足

if (allCustomers.stream().allMatch(customer -> customer.getAge() > 20)) {
    System.out.println("所有用戶年齡都大于20");
}

1.3.3 noneMatch

與allMatch操作相反,確保流中所有的元素都不滿足

if (getPersonList().stream().noneMatch(person -> person.getAge()>50)) {
       System.out.println("test3");
}

1.3.4 findAny

返回流中的任意一個元素,比如返回大于20歲的任意一個人

Optional<Person> optional = getPersonList().stream()
        .filter(person -> person.getAge() > 20)
        .findAny();
System.out.println(optional.get());

1.3.5 findFirst

返回流中的第一個元素

Optional<Person> optional = getPersonList().stream()
        .filter(person -> person.getAge() > 20)
        .findFirst();
System.out.println(optional.get());

1.3.6 reduce

接受兩個參數(shù):一個初始值,一個BinaryOperator accumulator將兩個元素合并成一個新的值 比如我們對一個數(shù)字list累加

List<Integer> numbers = Arrays.asList(1, 7, 3, 8, 2, 4, 9);
Integer sum = numbers.stream().reduce(0, (a, b) -> a + b);
System.out.println(sum);

找出流中的最大值、最小值 min、max

numbers.stream().reduce(Integer::max)
numbers.stream().reduce(Integer::min)

1.3.7 count

統(tǒng)計流中元素的個數(shù)

numbers.stream().count()

1.4 數(shù)據(jù)收集器collect

在Java8中已經(jīng)預(yù)定義了很多收集器,我們可以直接使用,所有的收集器都定義在了Collectors中,基本上可以把這些方法分為三類:

  • 將元素歸約和匯總成一個值

  • 分組

  • 分區(qū)

1.4.1 歸約和匯總

1.找出年齡最小和最大的人

List<Person> personList = getPersonList();
// 找出年齡最大和最小的客戶
Optional<Person> min = personList.stream().collect(Collectors.minBy(Comparator.comparing(Person::getAge)));
System.out.println(min);
Optional<Person> max = personList.stream().collect(Collectors.maxBy(Comparator.comparing(Person::getAge)));
System.out.println(max);

2.求平均年齡

List<Person> personList = getPersonList();
Double min = personList.stream().collect(Collectors.averagingInt(Person::getAge));
System.out.println(min);

3.進(jìn)行字符串的拼接

List<Person> personList = getPersonList();
// 找出年齡最大和最小的客戶
String collect = personList.stream().map(Person::getName).collect(Collectors.joining(","));
System.out.println(collect);

1.4.2 分組

1.根據(jù)用戶的年齡進(jìn)行分組

List<Person> personList = getPersonList();
Map<Integer, List<Person>> groupByAge = personList.stream().collect(Collectors.groupingBy(Person::getAge));

2.Map的key就是分組的值年齡,List<Person>就是相同年齡的用戶

List<Person> personList = getPersonList();
// 兩層分組 先安裝年齡分組,在按照名稱分組
Map<String, Map<Integer, List<Person>>> groups = personList.stream()
        .collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge)));

在相對于普通的分組,這里多傳了第二個參數(shù)又是一個groupingBy;理論上我們可以通過這個方式擴展到n層分組

3.分組后統(tǒng)計個數(shù)

List<Person> personList = getPersonList();
        Map<Integer, Long> groupByCounting = personList.stream()
                .collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));

4.以用戶所在地區(qū)分組后找出年齡最大的用戶

List<Person> personList = getPersonList();
Map<String, Optional<Person>> optionalMap = personList.stream()
        .collect(Collectors.groupingBy(Person::getName, Collectors.maxBy(Comparator.comparing(Person::getAge))));

關(guān)于java8中Stream如何使用問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

網(wǎng)頁標(biāo)題:java8中Stream如何使用
本文地址:http://aaarwkj.com/article16/peeggg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、ChatGPT、網(wǎng)站改版定制網(wǎng)站、網(wǎng)站策劃、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
黄色一级日本黄色一级| av免费在线观看大全| 五月婷婷丁香综合中文字幕| 国产一区999精品在线| 韩国午夜理伦三级好看| 蜜臀在线免费观看av| 亚洲福利一区福利三区| 久久综合午夜福利视频| 午夜久久精品国产亚洲av| 欧美生活一区二区三区| 亚洲,日韩,欧美久久综合| 日韩精品伦理中文字幕| 一区二区三区在线观看日本视频 | 亚洲av日韩av一区| 国产夫妻性生活视频播放| 在线观看免费在线观看免费| 99精品久久久中文字幕日本| 欧美日韩在线视频一区| 尤物视频在线观看羞羞| 欧美日韩一区二区三区在线| 亚洲国产熟对白剧情一区二区| 亚洲三区四区视频在线观看| 婷婷亚洲五月伊人91| 蜜臀国产综合久久第一页| 欧美日韩一级一区二区| 午夜精品四季av日日骚| 亚洲精品福利在线视频| 日本精品免费专区在线观看| 国产偷人伦激情在线观看| 国产九色91中文在线视频| 一区二区三区人妻av| 韩国三级网站在线观看视频| 特级艳片在线观看免费| 欧美黄色日本一区二区| 成人亚洲精品一区二区三区| 久久激情日本人妻av免费| 欧美日韩国产一区在线观看| 日韩一区二区三区免费播放 | 国产福利在线观看网站| 国产一级二级三级久久| 亚洲人妻一区二区三区久久精品 |