国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java Stream 最全操作用法合集

這篇具有很好參考價值的文章主要介紹了Java Stream 最全操作用法合集。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Java 8 引入了Stream流的操作,讓我們在開發(fā)的過程中感受到了很多的便利,小宋我也花時間總結(jié)了下關(guān)于Stream的堪稱最全的使用方法,話不多說,直接放大招。

流(stream)的類型

Java 8提供了兩種方式去創(chuàng)建流:

1、stream

stream是串行的,可以理解為它的執(zhí)行是按順序執(zhí)行的。

2、parallelStream

parallelStream是并行的,可以理解為它的執(zhí)行不是按順序執(zhí)行的,它的原理采用了分治的原理去實現(xiàn),可以點擊查看Fork/Join,我就不多做解釋啦,并行是為了充分利用CPU的性能,如果CPU不太行的話,還是不用吧,并行執(zhí)行會有不確定性,而且不是線程安全的,大家用的時候要多注意了。

流(stream)的創(chuàng)建種類

方法 舉例
Collectionstream()方法或者parallelStream() Arrays.asList(1,2,3).stream()
使用流的靜態(tài)方法 比如Stream.of(Object[]), IntStream.range(int, int) 或者 Stream.iterate(Object, UnaryOperator),如Stream.iterate(0, n -> n * 2),或者generate(Supplier s)如Stream.generate(Math::random)。
文件中獲得行的流 BufferedReader.lines()
Files類的操作路徑的方法 如list、find、walk等
隨機數(shù) Random.ints()
Arrays.stream(Object[])方法 Arrays.stream(new int[]{1,2,3})
其它一些類提供了創(chuàng)建流的方法 如BitSet.stream(),Pattern.splitAsStream(java.lang.CharSequence), 和 JarFile.stream()

流(stream)的中間操作

1. (常用)map()

map是stream中非常常用的一個方法,它用于映射每個元素到對應(yīng)的結(jié)果里面,可以讓你提取對象中的某一個屬性或者轉(zhuǎn)化成其它的對象,下面有幾個例子可以用作參考。

例1-獲取對應(yīng)的平方數(shù)
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
System.out.println(squaresList);
//輸出結(jié)果:[9, 4, 49, 25]  其中distinct()是去掉重復(fù)的值。
例2-將用戶的名字提取出來轉(zhuǎn)成字符串集

首先定義兩個對象,如下

@Data
public class StaffPublic {

    private String name;//名稱

    private Integer age;//年齡

    private String extra;//額外信息

    public Staff(String name, Integer age, String extra) {
        this.name = name;
        this.age = age;
        this.extra= extra;
    }
}
@Data
public class Staff {

    private String name;//名稱

    private Integer age;//年齡

    private String sex;//性別

    public Staff(String name, Integer age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}
List<Staff> staff = new ArrayList<>();
staff.add(new Staff("ricky",30,"man"));
staff.add(new Staff("jack",27,"man"));
staff.add(new Staff("lawrence",33,"woman"));
List<String> collect = staff.stream().map(x -> x.getName()).collect(Collectors.toList());
System.out.println(collect); 
//輸出 [ricky, jack, lawrence]
例3-將結(jié)果轉(zhuǎn)成另一個對象
List<StaffPublic> result = staff.stream().map(temp -> {
            StaffPublic obj = new StaffPublic();
            obj.setName(temp.getName());
            obj.setAge(temp.getAge());
            if ("ricky".equals(temp.getName())) {
                obj.setExtra("this field is for ricky only!");
            }
            return obj;
        }).collect(Collectors.toList());
System.out.println(result);
//輸出
[
    StaffPublic{name='ricky', age=30, extra='this field is for ricky only!'},
    StaffPublic{name='jack', age=27, extra='null'},
    StaffPublic{name='lawrence', age=33, extra='null'}
]

2. (常用)filter()

filter 主要用于通過設(shè)置的條件過濾出符合的元素,類似于一個過濾器。

例1-獲取空字符串的數(shù)量
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 獲取空字符串的數(shù)量
long count = strings.stream().filter(string -> string.isEmpty()).count();
// 輸出結(jié)果:2
例2-查找身高在1.8米及以上的男生
List<StudentInfo> studentList = new ArrayList<>();
studentList.add(new StudentInfo("李小明",true,18,1.76,LocalDate.of(2001,3,23)));
studentList.add(new StudentInfo("張小麗",false,18,1.61,LocalDate.of(2001,6,3)));
studentList.add(new StudentInfo("王大朋",true,19,1.82,LocalDate.of(2000,3,11)));
studentList.add(new StudentInfo("陳小跑",false,17,1.67,LocalDate.of(2002,10,18)));

List<StudentInfo> boys = studentList.stream().filter(s->s.getGender() && s.getHeight() >= 1.8)
									.collect(Collectors.toList());
StudentInfo.printStudents(boys);
// 輸出 "王大朋",true,19,1.82,2002-10-18   gender解釋 false代表女生 true代表男生

3. limit()

limit 對一個Stream進行截斷操作,獲取其前N個元素。如果原Stream中包含的元素個數(shù)小于N,那就獲取其所有的元素,這是一個short-circuiting 操作。

例1-用于獲取指定數(shù)量的流-1
Random random = new Random();
random.ints().limit(3).forEach(System.out::println);
// 輸出結(jié)果
93148391
-108910530
-654413184
例2-用于獲取指定數(shù)量的流-2
List<String> strings = Arrays.asList("abc", "dd", "bc", "efg", "abcd","cc", "jkl");
strings.stream().limit(2).forEach(System.out::println);
//輸出 abc dd

4. skip()

skip 可以對流進行一個跳過操作,可以通過自定義的數(shù)值N去跳過前N個元素。

例1-跳過前3個元素
List<String>strings = Arrays.asList("abc", "dd", "bc", "efg", "abcd","cc", "jkl");
strings.stream().skip(3).forEach(System.out::println);
// 輸出結(jié)果
efg
abcd
cc
jkl

5. distinct()

distinct 是對流進行一個去重的操作,是通過元素的hashcode()和equals()去判斷兩個元素是否一致的,這樣我們在使用對象去重的時候,可以通過重寫它的hascode和equals方法就可以達到我們想要的效果了。

例1-字符串?dāng)?shù)組去重
List<String>strings = Arrays.asList("abc", "dd", "bc", "abc", "bc","cc", "dd");
strings.stream().distinct().forEach(System.out::println);
// 輸出結(jié)果
abc
dd
bc
cc

6. peek()

peek 生成一個包含原Stream的所有元素的新Stream,同時會提供一個消費函數(shù)(Consumer實例),新Stream每個元素被消費的時候都會執(zhí)行給定的消費函數(shù),peek主要被用在debug用途。

例1-實例
Stream.of("one", "two", "three","four").filter(e -> e.length() > 3)
                .peek(e -> System.out.println("Filtered value: " + e))
                .map(String::toUpperCase)
                .peek(e -> System.out.println("Mapped value: " + e))
                .collect(Collectors.toList());
//輸出
Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR

7. sorted()

sorted 是對流進行一個排序操作。

  • sorted 自然排序(Comparable)
  • sorted(Comparator com) 定制排序(Comparator)
例1-sorted自然排序
List<String> list = Arrays.asList("cc","aa","dd","bb");
        list.stream().sorted().forEach(System.out::println);
//輸出
aa
bb
cc
dd
例2-sorted自然排序逆序
List<String> list = Arrays.asList("cc","aa","dd","bb");
        list.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);
//輸出
dd
cc
bb
aa
例3-sorted定制排序
@Data
@AllArgsConstructor
public class Employee {
    private String name;
    private Integer age;
}
// 初始化參數(shù)
List<Employee> list = new ArrayList<>();
        list.add(new Employee("張三",33));
        list.add(new Employee("李四",28));
        list.add(new Employee("王五",25));
        list.add(new Employee("趙六",40));
        list.add(new Employee("孫七",18));
list.stream().sorted(Comparator.comparingInt(Employee::getAge)).forEach(System.out::println);
// 輸出
Employee(name=孫七, age=18)
Employee(name=王五, age=25)
Employee(name=李四, age=28)
Employee(name=張三, age=33)
Employee(name=趙六, age=40)
例4-sorted定制排序逆序
list.stream().sorted(Comparator.comparingInt(Employee::getAge).reversed()).forEach(System.out::println);
//輸出
Employee(name=趙六, age=40)
Employee(name=張三, age=33)
Employee(name=李四, age=28)
Employee(name=王五, age=25)
Employee(name=孫七, age=18)

流(stream)的終止操作

1.(常用)collect()

collect 方法的功能是將 Stream 中數(shù)據(jù)轉(zhuǎn)換為最終的結(jié)果

例1-基礎(chǔ)用法
List list= Arrays.asList("a", "b", "c", "d");

List collect =list.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(collect); 
//輸出
[A, B, C, D]

數(shù)組所有元素,按某種規(guī)律計算:
List num = Arrays.asList(1,2,3,4,5);
List collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());
System.out.println(collect1); 
//輸出
[2, 4, 6, 8, 10]
例2-轉(zhuǎn)換不同類型
Stream<String> stream = Stream.of("hello", "world", "helloworld");
//轉(zhuǎn)成ArrayList
ArrayList<String> list = stream.collect(Collectors.toCollection(ArrayList::new));
//轉(zhuǎn)成TreeSet
TreeSet<String> treeSet = stream.collect(Collectors.toCollection(TreeSet::new));
例3-拼接字符串
Stream<String> stream = Stream.of("hello", "world", "helloworld");
        String s = stream.collect(Collectors.joining(","));
        System.out.println(s);
//輸出
hello,world,helloworld
例4-Collectors.mapping 映射
List<Employee> list = new ArrayList<>();
list.add(new Employee("張三", 33));
list.add(new Employee("李四", 28));
list.add(new Employee("王五", 25));
list.add(new Employee("趙六", 40));
list.add(new Employee("孫七", 18));
String nameList = list.stream().collect(Collectors.mapping(Employee::getName, Collectors.joining(",")));
System.out.println(nameList);
//輸出結(jié)果
張三,李四,王五,趙六,孫七
例5-Collectors.minBy 比較取小
Employee employee = list.stream().collect(Collectors.minBy(Comparator.comparingInt(Employee::getAge))).get();
System.out.println(employee);
//輸出結(jié)果
Employee(name=孫七, age=18)
例6-Collectors.maxBy 比較取大
Employee employee = list.stream().collect(Collectors.maxBy(Comparator.comparingInt(Employee::getAge))).get();
System.out.println(employee);
//輸出結(jié)果
Employee(name=趙六, age=40)
例7-Collectors.summarizingInt 年齡求和,此外還有summarizingDouble與summarizingLong,用法一致。
long sum = list.stream().collect(Collectors.summarizingInt(Employee::getAge)).getSum();
System.out.println(sum);
//輸出結(jié)果
144
例8-Collectors.averagingInt 年齡求平均值,此外還有averagingDouble與averagingLong,用法一致。
Double avgAge = list.stream().collect(Collectors.averagingInt(Employee::getAge));
System.out.println(avgAge);
//輸出結(jié)果
28.8
例9-Collectors.groupingBy分組,整理出的結(jié)果以Map的形式展現(xiàn)。
List<Employee> list = new ArrayList<>();
list.add(new Employee("張三", 20));
list.add(new Employee("李四", 20));
list.add(new Employee("王五", 30));
list.add(new Employee("趙六", 30));
list.add(new Employee("孫七", 40));
Map<Integer, List<Employee>> employeeMap = list.stream().collect(Collectors.groupingBy(Employee::getAge));
for (Integer age : employeeMap.keySet()) {
    System.out.println(age+"年齡組有");
    employeeMap.get(age).stream().forEach(System.out::println);
}
//輸出結(jié)果
20年齡組有
Employee(name=張三, age=20)
Employee(name=李四, age=20)
40年齡組有
Employee(name=孫七, age=40)
30年齡組有
Employee(name=王五, age=30)
Employee(name=趙六, age=30)
例10-Collectors.partitioningBy 條件分組,整理出的結(jié)果以Map的形式展現(xiàn),key為Boolean類型,true一組,false一組。
List<Employee> list = new ArrayList<>();
list.add(new Employee("張三", 33));
list.add(new Employee("李四", 28));
list.add(new Employee("王五", 25));
list.add(new Employee("趙六", 40));
list.add(new Employee("孫七", 18));
//年齡是否大于30
Map<Boolean, List<Employee>> employeeMap = list.stream().collect(Collectors.partitioningBy(k -> k.getAge().compareTo(30) > 0));
for (Boolean b : employeeMap.keySet()) {
    System.out.println(b ? "大于30的有" : "小于30的有");
    employeeMap.get(b).stream().forEach(System.out::println);
}
//輸出結(jié)果
小于30的有
Employee(name=李四, age=28)
Employee(name=王五, age=25)
Employee(name=孫七, age=18)
大于30的有
Employee(name=張三, age=33)
Employee(name=趙六, age=40)
例11-(常用)Collectors.toMap 將結(jié)果轉(zhuǎn)換成Map,可能會導(dǎo)致key重復(fù)的情況,需自行配置規(guī)則防止重復(fù)key報錯。
List<Employee> list = new ArrayList<>();
list.add(new Employee("張三", 33));
list.add(new Employee("李四", 28));
list.add(new Employee("王五", 25));
list.add(new Employee("趙六", 40));
list.add(new Employee("孫七", 18));
//年齡是否大于30
Map<String, Employee> employeeMap = list.stream().collect(Collectors.toMap(k -> k.getName(), v -> v, (o1, o2) -> o1));
for (String name : employeeMap.keySet()) {
    System.out.println(name + "年齡是:" + employeeMap.get(name).getAge() + "歲");
}
//輸出結(jié)果
孫七年齡是:18歲
李四年齡是:28歲
張三年齡是:33歲
王五年齡是:25歲
趙六年齡是:40

2.(常用)forEach()

迭代流中的每一個數(shù)據(jù),等同于for循環(huán)

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

List<String> items = Arrays.asList("a","b","c","d","e");
items.forEach(item->System.out.println(item));
//輸出 a,b,c,d,e

3.find相關(guān)的操作

  • findAny查找任何一個就返回 Optional
List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");
String result = strings.stream().filter(str -> str.equals("dd"))
                .findAny()
                .orElse(null);
System.out.println(result);
//輸出 dd
  • findFirst查找到第一個就返回 Optional
List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");
String result = strings.stream().filter(str -> str.equals("dd"))
                .findFirst()
                .orElse(null);
System.out.println(result);
//輸出 dd
  • anyMatch匹配上任何一個則返回Boolean
List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");
Boolean result = strings.stream().anyMatch(str -> str.equals("dd"));
System.out.println(result);
//輸出 true
  • allMatch匹配所有的元素則返回Boolean
List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");
Boolean result = strings.stream().allMatch(str -> str.equals("dd"));
System.out.println(result);
//輸出 false
  • noneMatch檢查在所需位置是否沒有帶有必需字符的元素,返回Boolean
List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");
Boolean result = strings.stream().noneMatch(str -> str.equals("ff"));
System.out.println(result);
//輸出 true

4.reduce()

它可以把一個Stream的所有元素按照聚合函數(shù)聚合成一個結(jié)果文章來源地址http://www.zghlxwxcb.cn/news/detail-592737.html

// 0代表初始值 如果不傳0 則使用第一個元素作為初始值,acc是計算值,n 是每個元素
int sum = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9).reduce(0, (acc, n) -> acc + n);
System.out.println(sum); // 45

//不傳初始值的情況下,返回的是Optional類型的結(jié)果
List<Integer> numList = Arrays.asList(1,2,3,4,5);
Optional<Integer> result = numList.stream().reduce((a, b) -> a + b);
System.out.println(result.get());

到了這里,關(guān)于Java Stream 最全操作用法合集的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java中stream流的常見用法

    這篇文章主要是記錄stream流的用法,因為stream流比較常用,并且一些操作較復(fù)雜,記錄在此,以后參考。 1、filter用法 主要是用來過濾集合中的元素,較常用。 2、peek用法 主要是用來修改元素的狀態(tài),比如其中對象的字段等 3、map用法 主要是用來替換集合中的元素 4、flatma

    2024年02月12日
    瀏覽(30)
  • Java中Stream流式計算的用法詳解

    在Java 8之后,引入了Stream API,它是一個函數(shù)式編程的思想,其主要作用是將集合Stream化,可以使用一條語句對集合進行過濾、排序、統(tǒng)計等多種操作。接下來我們將詳細(xì)介紹Java中Stream流式計算的用法。 Stream 接口是Java中定義的一個操作集合的高級抽象,它提供了大量的操作

    2024年02月01日
    瀏覽(27)
  • Java8中Stream詳細(xì)用法大全

    Java8中Stream詳細(xì)用法大全

    Java 8 是一個非常成功的版本,這個版本新增的Stream,配合同版本出現(xiàn)的Lambda ,給我們操作集合(Collection)提供了極大的便利。Stream流是JDK8新增的成員,允許以聲明性方式處理數(shù)據(jù)集合,可以把Stream流看作是遍歷數(shù)據(jù)集合的一個高級迭代器。Stream 是 Java8 中處理集合的關(guān)鍵抽

    2023年04月08日
    瀏覽(31)
  • 【Java基礎(chǔ)】Stream 流中 Collectors.toMap 的用法

    Collectors.toMap() 方法是把 List 轉(zhuǎn) Map 的操作 1.1、如果不是對象,是數(shù)組,怎么轉(zhuǎn)成map? 按照規(guī)范來寫的話,最好所有toMap,都要將這個異常提前考慮進去,不然有時候會報重復(fù)主鍵異常,這也是正例的寫法,上面的屬于反例的寫法。 2.1、Collectors.toMap 有三個重載方法:? 參數(shù)解

    2024年02月14日
    瀏覽(18)
  • Java stream 分組操作

    根據(jù)單/多字段分組 單字段分組可以直接使用指定字段,多字段分組則采用拼接Key的形式 單字段: 多字段: 多層級: 測試

    2024年02月15日
    瀏覽(25)
  • Java 8 Stream 流操作

    Java 8 Stream 流操作

    博主 默語帶您 Go to New World. ? 個人主頁—— 默語 的博客???? 《java 面試題大全》 《java 專欄》 ??惟余輩才疏學(xué)淺,臨摹之作或有不妥之處,還請讀者海涵指正。??? 《MYSQL從入門到精通》數(shù)據(jù)庫是開發(fā)者必會基礎(chǔ)之一~ ?? 吾期望此文有資助于爾,即使粗淺難及深廣,亦

    2024年04月16日
    瀏覽(23)
  • java Stream去重操作

    ?1.根據(jù)對象的某個屬性去重: 網(wǎng)上找的stream流去重方法,可以根據(jù)類的某個屬性去重,這里記錄一下 使用:

    2024年02月10日
    瀏覽(15)
  • 49天精通Java,第41天,java stream流詳解,從集合遍歷,看stream流操作
  • 49天精通Java,第42天,java stream流詳解,從集合遍歷,看stream流操作
  • java 8 stream流的19種用法,可應(yīng)對大多數(shù)集合的處理場景

    java 8的Stream API是一種非常強大的集合處理工具,它提供了一種新的、高效的、聲明式的方式來處理集合數(shù)據(jù)。下面我們就來看一下Java 8 Stream API的所有用法。 可以使用Stream.of()方法創(chuàng)建一個Stream: 也可以使用集合的stream()方法創(chuàng)建一個Stream: 可以使用filter()方法過濾Stream中的

    2023年04月08日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包