1、什么是Stream流? java8中的stream使用的是函式式編程模式,如同它的名字一樣,它可以被用來對集合或陣列進行鏈狀流式的操作,可以更方便的我們對集合或陣列操作, 例子:
// 如下例所示,簡化了對集合的操作
Integer[] intArray = new Integer[]{2,3,4,5,6,7};
// 創建Stream流物件
Stream<Integer> intStream = Stream.of(intArray);
intStream.distinct()//去重(中間操作)
.filter(ele -> ele > 4)//過濾(中間操作)
.forEach(ele -> System.out.println(ele));(終結操作)
2、如何使用Stream流?
公式:創建流 + 中間操作 + 終結操作
(必須要有終結操作,前面的中間操作才會執行)
1)創建流(備注:Collection介面實作類為單列集合,如List和Set;Map介面實作類為雙列集合,如Map)
型別一:單列集合:集合物件.stream()
List<Integer> integerList = new ArrayList<>(); Stream<Integer> stream = integerList.stream();
型別二: 陣列:Arrays.stream(陣列)或者使用Stream.of來創建
Integer[] intArray = new Integer[]{2,3,4,5,6,7};
Stream<Integer> intStream = Stream.of(intArray);
intStream = Arrays.stream(intArray);
型別三:雙列集合:轉換成單列集合后創建
Map<String,Object> map = new HashMap<>(); Stream<Map.Entry<String,Object>> mapStream = map.entrySet().stream();2)中間操作 filter( ) // 用作過濾集合元素 map( ) // 修改流中的物件指定,可以指定為流中物件的屬性(非集合屬性)
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("xiaoming", 2));
Stream<Person> stream = integerList.stream();
stream.distinct() // 流,在這里的時候還是Person物件
.map(new Function<Person, String>() {
// 經過map方法之后,轉化為name了
@Override
public String apply(Person person){
return person.name;
}
}).forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
// lambda格式
Stream<Person> stream = integerList.stream();
// 經過map方法之后,轉化為name了
stream.distinct() // 流,在這里的時候還是Person物件
.map(person -> person.name)
.forEach(s -> System.out.println(s));
distinct( ) // 去重,一般需要重寫物件的equals方法
sorted( ) // 排序
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("xiaoming", 2));
Stream<Person> stream = integerList.stream();
stream.sorted(((o1, o2) -> o1.age - o2.age))
.forEach(s -> System.out.println(s));
limit( ) // 可以設定流的最大長度,超出部分將被拋棄
skip( ) // 跳過流中的前n個元素,回傳剩下的元素
flatMap( ) //修改流中的物件指定,可以指定為流中物件的屬性(集合屬性)
// 如下,統計Person list里面所有的book數量
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("xiaoming", 2));
Stream<Person> stream = integerList.stream();
stream.flatMap(new Function<Person, Stream<?>>() {
@Override
public Stream<?> apply(Person person) {
return person.books.stream();
}
})
.forEach(s -> System.out.println(s));
// lambda格式
stream.flatMap((Function<Person, Stream<?>>) person -> person.books.stream())
.forEach(s -> System.out.println(s));
3)終結操作
forEach( ) // 對流中的元素進行遍歷
count( ) // 獲取流中的元素個數
max( ) // 獲取流中的最大值
min( ) // 獲取流中的最小值
collect( ) // 將流轉化為一個集合
// 展示collect的使用方式
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("xiaoming", 2));
Stream<Person> stream = integerList.stream();
//List<Person> list = stream.collect(Collectors.toList());
//Set<Person> set = stream.collect(Collectors.toSet());
Map<String,Object> map = stream.collect(Collectors.toMap(person -> person.name, person -> person.books));
anyMatch( ) // 判斷任意是否匹配
allMatch( ) // 判斷是否全部匹配
noneMatch( ) // 判斷是否全部不匹配
findAny( ) // 獲取任意一個元素
findFirst( ) // 獲取第一個元素
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("xiaoming", 2));
Stream<Person> stream = integerList.stream();
stream.findFirst()
.ifPresent(person -> System.out.println(person.name));
reduce( ) // 歸并,reduce的作用是把stream中的元素給組合起來,我們可以傳入一個初始值,它會按照我們的計算方式依次拿流中的元素和在初始化值的基礎上進行計算,計算結果再和后面的元素計算,
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("xiaoming", 2));
Stream<Person> stream = integerList.stream();
// 統計所有person的年齡
Integer sum = stream.map(person -> person.age)
.reduce(0, new BinaryOperator<Integer>() {
@Override
public Integer apply(Integer result, Integer element) {
return result + element;
}
});
// lambda
// 統計所有person的年齡
Integer sum = stream.map(person -> person.age)
.reduce(0, (result, element) -> result + element);
**此處補充一張Idea Debug Stream流的方法


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/509074.html
標籤:Java
下一篇:Spring(三):IoC的本質
