jdk1.8 Stream的Array、List轉換等常見用法

Stream是jdk8中java.util包中的新特性

Stream(流)是一個來自數據源的元素隊列並支持聚合操作

  • 元素是特定類型的對象,形成一個隊列。 Java中的Stream並不會存儲元素,而是按需計算。
  • 數據源 流的來源。 可以是集合,數組,I/O channel, 產生器generator 等。
  • 聚合操作 類似SQL語句一樣的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作還有兩個基礎的特徵:

  • Pipelining: 中間操作都會返回流對象本身。 這樣多個操作可以串聯成一個管道, 如同流式風格(fluent style)。 這樣做可以對操作進行優化, 比如延遲執行(laziness)和短路( short-circuiting)。
  • 內部迭代: 以前對集合遍歷都是通過Iterator或者For-Each的方式, 顯式的在集合外部進行迭代, 這叫做外部迭代。 Stream提供了內部迭代的方式, 通過訪問者模式(Visitor)實現。

常用例子代碼

// user對象List轉user對象中name字符串的List
List<String> stringList= list.stream().map(UserList::getName).collect(Collectors.toList());
// 1. Stream賦值
Stream stream = Stream.of("a", "b", "c");
// 2. Arrays數組轉Stream
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
// 3. 轉list
List<String> list = Arrays.asList("a","b","c","d");
// 4.list轉Stream
stream = list.stream();
// map 方法用於映射每個元素到對應的結果,以下代碼片段使用 map 輸出了元素對應的平方數:

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());

// filter 方法用於通過設置的條件過濾出元素。以下代碼片段使用 filter 方法過濾出空字符串:
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// count獲取空字符串的數量
int count = strings.stream().filter(string -> string.isEmpty()).count();
// 求和
int sum = numbers.stream().mapToInt((x) -> x).summaryStatistics().getSum;

 BigDecimal practiceConversionScore = checkList.getRecords().stream()
                .map(RcyLearnTaskUserLinkDto::getRcyLearnTaskUserLinkVo)
                .map(RcyLearnTaskUserLinkVo::getPracticeConversionScore)
                .reduce(BigDecimal.ZERO, BigDecimal::add);

// 集合轉map
Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));

 //交集
List<String> collect1 = list1.stream().filter(num -> list2.contains(num))
                .collect(Collectors.toList());

//差集 list1-list2
 List<String> collect2 = list1.stream().filter(num -> !list2.contains(num))
                .collect(Collectors.toList());
 

//差集list2-list1
List<String> collect3 = list2.stream().filter(num -> !list1.contains(num))
                .collect(Collectors.toList());

 //並集  不去重
list1.addAll(list2);


//並集  去重
List<String> collect4 = list1.stream().distinct().collect(Collectors.toList());


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章