- 例子:突出lambda表达式的优点;简化代码
/**
* jdk1.8之前写法与jdk1.8现在写法 对比
*/
public class Demo1 {
private static final List<String> STR_LIST = Lists.newArrayList("ab", "xyz", "789", "axy", "azzzzz", "a678", "a1234");
public static void main(String[] args) {
// 过滤字符串,找到以a开头的,排序,后生成一个字符串,并用,进行分割
// abc,axy,azz -> "abc,axy,azz"
foo1();
foo2();
}
/**
* 使用jdk1.8之前的原生写法
*/
public static void foo1() {
List<String> bufList = Lists.newArrayList();
for (String s : STR_LIST) {
if (!s.startsWith("a")) {
continue;
}
bufList.add(s);
}
bufList.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
});
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bufList.size(); i++) {
if (i == bufList.size() - 1) {
builder.append(bufList.get(i));
continue;
}
builder.append(bufList.get(i)).append(",");
}
String result = builder.toString();
System.out.println("foo1 result = " + result);
}
/**
* 使用jdk1.8 lambda+stream来处理
*/
public static void foo2() {
String result = STR_LIST.stream()
.filter(str -> str.startsWith("a"))
.sorted(Comparator.comparingInt(String::length))
.collect(Collectors.joining(","));
System.out.println("foo2 result = " + result);
}
}
将集合流化
public static void main(String[] args) {
List<String> strs = Lists.newArrayList("ab", "xyz", "789", "axy", "azzzzz", "a678", "a1234");
Set<String> sets = Sets.newHashSet();
int[] arr = new int[10];
// 2.并行流
strs.parallelStream();
sets.parallelStream();
- 创建普通流
正常操作 ,数据量比较小
// 1.流化操作,普通流
strs.stream();
sets.stream();
Arrays.stream(arr);
- 创建并行流
数据量比较大,提升效率,提升性能(上w,几十w)
// 1.流化操作,普通流
strs.stream();
sets.stream();
Arrays.stream(arr);
中间操作,过滤器,filter演示
private static void testFilter(List<String> strs) {
strs.stream()
//第一个过滤器,长度大于等于5;第二个过滤器已b开头;二个条件需全部满足
.filter(str -> str.length() >= 5)
.filter(str -> str.startsWith("b"))
.forEach(str -> System.out.println("str=" + str));
}
中间操作 映射操作
private static void testMap(List<String> strs) {
strs.stream()
.map(str -> str.toUpperCase())
.map(str -> str +";")
.forEach(str -> System.out.println("str="+str));
结果
str=AB;
str=BYZ;
str=789;
str=AXY;
str=AZZZZZ;
str=A678;
str=A1234;
str=B1236;
中间操作 排序
private static void testSort(List<String> strs) {
//默认的排序方式
strs.stream()
.sorted().forEach(str -> System.out.println("str = " + str));
System.out.println("=================");
strs.stream()
.sorted().sorted(Comparator.comparingInt(String::length)).forEach(str -> System.out.println("str = " + str));
中间操作: skip +limit
/**
* 中间操作: skip +limit
* 跳过几个,限制几行;类似分页
* @param strs
*/
private static void testLimitAndSkip(List<String> strs) {
strs.stream()
.skip(2)
.limit(3)
.forEach(str -> System.out.println("str = " + str));
}
中间操作 peek
我们看不到流的操作,想看的话,就用peek;
不改变数据,输出每个节点的数据
中间操作 flatMap((对流扁平化处理)) ------难点
private static void testFlatMap() {
List<List<String>> strsList = Lists.newArrayList();
List<String> strs1 = Lists.newArrayList("ab", "byz", "789");
List<String> strs2 = Lists.newArrayList("abc", "byz", "89y");
List<String> strs3 = Lists.newArrayList("yab", "byc", "sdf");
strsList.add(strs1);
strsList.add(strs2);
strsList.add(strs3);
// -------
// 需求: 将大集合中的所有字符串 全部转成大写
// 用之前所学的转化操作,就这样搞,但是比较恶心.
// Stream<List<String>> stream = strsList.stream();
// stream.forEach(strList -> {
// strList.stream().map(String::toUpperCase).forEach(str -> {
// System.out.println("str = " + str);
// });
// });
strsList.stream()
// FlatMap做了啥
// .flatMap(list -> list.stream())
// .map(str -> str.toUpperCase())
.flatMap(Collection::stream)
.map(String::toUpperCase)
.forEach(str -> System.out.println("str = " + str));
结束操作
结束操作
* --直接拿到结果
* + count
* + findFirst
* + findAny
* + forEach
*
* 做统计,collect*
count -统计结果
private static void testCount(List<String> strs) {
long count = strs.stream()
.filter(str -> str.length() > 3)
// .forEach(str -> System.out.println("str=" + str));
.peek(str -> System.out.println("str = " + str))
.count();
System.out.println("count = " + count);
}
FindFirst -首个
private static void testFindFirst(List<String> strs) {
Optional<String> optional = strs.stream()
.filter(str -> str.startsWith("a")).findFirst();
if (optional.isPresent()) {
String val = optional.get();
System.out.println("val = " + val);
}
}
- Optional详解-tudo
collect操作
Collectors.toSet() ,转成List(集合)
private static void testCollectToSet(List<String> strs) {
Set<String> data = strs.stream()
.filter(str -> str.length() > 3)
.map(str -> str + "*")
.collect(Collectors.toSet());
System.out.println("data = " + data);
}
结果
data = [b1236*, y123*, x123*, a678*, axylonglog*, a12345*, z123*, azzzzz*]
Collectors.toMap(),转成k,v形式
private static void testCollectToMap(List<String> strs) {
Map<String, Integer> data = strs.stream()
.filter(str -> str.length() > 3)
.map(str -> str + "*")
.distinct()
.collect(Collectors.toMap(str -> str, str -> str.length()));
data.forEach((k,v)->{
System.out.println("data map k = " + k+",v="+v);
});
}
结果
data map k = b1236*,v=6
data map k = y123*,v=5
data map k = x123*,v=5
data map k = a678*,v=5
data map k = axylonglog*,v=11
data map k = a12345*,v=7
data map k = z123*,v=5
data map k = azzzzz*,v=7
Collectors.groupingBy() ,分组
private static void testGroupBy(List<String> strs) {
Map<Integer, List<String>> data = strs.stream()
.filter(str -> !Strings.isNullOrEmpty(str))
.collect(Collectors.groupingBy(str -> str.length()));
data.forEach((k,v)->{
System.out.println("所属长度="+k);
System.out.println(" 数据内容=="+v);
System.out.println("\n");
});
}
结果
所属长度=2
数据内容==[ab]
所属长度=3
数据内容==[byz, 789]
所属长度=4
数据内容==[a678, x123, y123, z123]
所属长度=5
数据内容==[b1236]
所属长度=6
数据内容==[azzzzz, azzzzz, azzzzz, azzzzz, a12345, a12345, a12345]
所属长度=10
数据内容==[axylonglog]
Collectors.partitioning(),已xxx条件分区
private static void testPartitioning(List<String> strs) {
Map<Boolean, List<String>> data = strs.stream()
.filter(str -> !Strings.isNullOrEmpty(str))
.collect(Collectors.partitioningBy(str -> str.length() > 5));
data.forEach((k,v)->{
if(k){
System.out.println("分区字符串长度大于5:"+v);
}else {
System.out.println("分区字符串长度小于5:"+v);
}
});
}
结果
分区字符串长度小于5:[ab, byz, 789, a678, b1236, x123, y123, z123]
分区字符串长度大于5:[axylonglog, azzzzz, azzzzz, azzzzz, azzzzz, a12345, a12345, a12345]
Collectors.joining(),已xx连接
private static void testJoining(List<String> strs) {
String data = strs.stream()
.filter(str -> !Strings.isNullOrEmpty(str))
.collect(Collectors.joining("+"));
System.out.println("data = " + data);
}
结果
data = ab+byz+789+axylonglog+azzzzz+azzzzz+azzzzz+azzzzz+a678+a12345+a12345+a12345+b1236+x123+y123+z123