Java8-Stream筆記

分批處理數據

在程序經常會處理集合數據,有時直接處理整個集合並不是很好的主意,通常需要分批次處理。比如在批量查詢/插入數據到數據庫的時候。

import com.google.common.collect.Iterables;
import org.apache.commons.collections4.CollectionUtils;

import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public static <T> Stream<List<T>> partitionStream(Collection<T> coll, int size) {
  if (CollectionUtils.isEmpty(coll)) {
    return Stream.empty();
  }
  return StreamSupport.stream(Iterables.partition(coll, size).spliterator(), false);
}

分組統計

有時候我們拿到一個集合,裏面有重複的元素,想統計每個元素的個數,如何做?

簡單集合

List<String> items = Arrays.asList("a", "b", "b", "b", "c", "c", "c");
Map<String, Long> result2 = items.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(result2);//{a=1, b=3, c=3}

實體集合

通過用TreeMap接收結果實現排序功能

List<VisitorLogs> visitorLogs = Lists.newArrayList(
                new VisitorLogs("2020-06-27", 8),
                new VisitorLogs("2020-06-27", 9),
                new VisitorLogs("2020-06-30", 7),
                new VisitorLogs("2020-06-30", 9),
                new VisitorLogs("2020-06-30", 1),
                new VisitorLogs("2020-07-05", 1),
                new VisitorLogs("2020-07-05", 8),
                new VisitorLogs("2020-07-05", 6));

TreeMap<String, Integer> collect = visitorLogs.stream().collect(Collectors.groupingBy(d -> d.getTime(), TreeMap::new, Collectors.summingInt(o -> o.getCount())));
System.out.println(collect);//{2020-06-27=13, 2020-06-30=17, 2020-07-05=15}

@Data
@NoArgsConstructor
@AllArgsConstructor
public class VisitorLogs implements Comparable<VisitorLogs> {
    private String time;
    private int count;

    @Override
    public int compareTo(VisitorLogs o) {
        return time.compareTo(o.time);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章