Java字段片段
字符串
按长度分割
//com.google.common.base.Splitter
Iterable<String> list = Splitter.fixedLength(3).split("stringvalue");
System.out.println(list);//[str, ing, val, ue]
集合
快速创建Map
//com.google.common.collect.ImmutableMap
Map<String, ArrayList<String>> map1 = ImmutableMap.of("list", new ArrayList<>());
Map<String, Integer> map2 = ImmutableMap.<String, Integer>builder().put("key1", 1).put("key2", 2).build();
交集、并集和差集
//com.google.common.collect.Sets
Set<Integer> sets1 = Sets.newHashSet(1, 2, 3, 4, 5);
Set<Integer> sets2 = Sets.newHashSet(4, 5, 6, 7, 8, 9);
//交集 [4, 5]
System.out.println(Sets.intersection(sets1, sets2));
//并集 set1 + set2 [1, 2, 3, 4, 5, 6, 7, 8, 9]
System.out.println(Sets.union(sets1, sets2));
//差集 set1 - set2 [1, 2, 3]
System.out.println(Sets.difference(sets1, sets2));
集合拆分
将一个大的集合按指定数量拆分成若干个小集合,分批执行
//com.google.common.collect.Lists
List<List<String>> partition1 = Lists.partition(Lists.newArrayList("a", "b", "c", "d", "e"), 2);
System.out.println(partition1);//[[a, b], [c, d], [e]]
//com.google.common.collect.Iterables
Iterable<List<String>> partition2 = Iterables.partition(Lists.newArrayList("a", "b", "c", "d", "e"), 2);
System.out.println(partition2);//[[a, b], [c, d], [e]]
//com.google.common.collect.Iterables
//org.apache.commons.collections4.CollectionUtils
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}
分批处理数据
在程序经常会处理集合数据,有时直接处理整个集合并不是很好的主意,通常需要分批次处理。比如在批量查询/插入数据到数据库的时候。
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);
}
//Guava集合分组
List<String> list = new ArrayList<>();
//按每50个一组分割
List<List<String>> parts = Lists.partition(list, 50);
分组统计
有时候我们拿到一个集合,里面有重复的元素,想统计每个元素的个数,如何做?
简单集合
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);
}
}