Java8:stream的使用及备忘(java stream操作)
一、描述
Stream 是 Java8的一个亮点,更是 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 提供了一种高效且易于使用的处理数据的方式。
Stream流的具体用法
1.流的创建
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //顺序流
Stream<String> stringStream = list.parallelStream(); //并行流
2.将数组转成流
Integer[] nums = new Integer[]{0,2,9,5};
Stream<Integer> Integerstream = Arrays.stream(nums);
3.使用BufferedReader.lines()方法,将每行内容转成流
Stream<String> lineStream2 = new BufferedReader(new FileReader("E:\\test_stream.txt")).lines();
4. 流的中间操作
filter: 过滤流中的某些元素
limit(n): 获取n个元素,限制获取元素的个数
skip(n): 跳过n元素,配合limit(n)可实现分页
distinct: 通过流中元素的 hashCode() 和 equals() 去除重复元素
Stream<Integer> stream = Stream.of(6,6,6,12,22,12,213,111,7,9,10);
Stream<Integer> streamFilter = stream.filter(item -> item > 10) // 12 22 12 213 111
.distinct() //12 22 213 111
.skip(2) //213 111
.limit(1);//213
streamFilter.forEach(System.out::println);
5 map 和flatmap
/ 1. map的使用实例
List<String> list = Arrays.asList("a,b,c", "1,2,3");
// 去掉字符串中所有的,
List<String> collect = list.stream().map(s -> s.replaceAll(",", "")).collect(Collectors.toList());
// collect集合内容为:{abc,123}
System.out.println(collect);
// 2. flatMap 接收一个函数作为参数,将流中的每个值都换成另一个流,
// 然后把所有流连接成一个流。
Stream<String> stringStream = list.stream().flatMap(s -> {
// 将字符串以,分割后得到一个字符串数组
String[] split = s.split(",");
// 然后将每个字符串数组对应流返回,flatMap会自动把返回的所有流连接成一个流
Stream<String> stream = Arrays.stream(split);
return stream;
});
6.排序:sorted
stream.sorted(); // 按照sortNo排序
stream.sorted((x,y)->Integer.compare(x.getSortNo(),y.getSortNo()));
7.流的终止操作
allMatch,noneMatch,anyMatch,findFirst,findAny,count,max,min
// 匹配和聚合
allmatch,noneMatch,anyMatch用于对集合中对象的某一个属性值是否存在判断。
allMatch全部符合该条件返回true,
noneMatch全部不符合该断言返回true
anyMatch 任意一个元素符合该断言返回true
// 实例:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
boolean allMatch = list.stream().allMatch(e -> e > 10); //false
boolean noneMatch = list.stream().noneMatch(e -> e > 10); //true
boolean anyMatch = list.stream().anyMatch(e -> e > 4); //true
// 其他一些方法
findFirst:返回流中第一个元素
String firstMatchedName = memberNames.stream()
.filter((s) -> s.startsWith("L"))
.findFirst().get();
findAny:返回流中的任意元素
count:返回流中元素的总个数
long totalMatched = memberNames.stream()
.filter((s) -> s.startsWith("A"))
.count();
max:返回流中元素最大值
min:返回流中元素最小值
8,实操【节选】
List<RouteBean> routeBeans = channelConfigs.stream()
.filter(payProviderChannelConfig ->
payProviderChannelConfig.getInterfaceCode() == PaySignEnum.ALLIN_INTERFACE_TYPE_PAY.getCode())
.map(payProviderChannelConfig -> RouteBean.builder()
.providerChanl(payProviderChannelConfig.getProviderChannel())
.providerChanlName(payProviderChannelConfig.getProviderChanlName())
.interfaceCode(payProviderChannelConfig.getInterfaceCode().toString())
.interfaceCodeName(payProviderChannelConfig.getInterfaceCodeName())
.level(payProviderChannelConfig.getPayLevel())
.channelFeeExpression(
debitBankConfigMap.get(
String.format("%s_%s", payProviderChannelConfig.getProviderChannel().toString(),
payProviderChannelConfig.getInterfaceCode().toString())) == null ? null :
debitBankConfigMap.get(
String.format("%s_%s", payProviderChannelConfig.getProviderChannel().toString(),
payProviderChannelConfig.getInterfaceCode().toString())).getChannelFeeExpression())
.singleLimitAmount(
debitBankConfigMap.get(
String.format("%s_%s", payProviderChannelConfig.getProviderChannel().toString(),
payProviderChannelConfig.getInterfaceCode().toString())) == null ? null :
debitBankConfigMap.get(
String.format("%s_%s", payProviderChannelConfig.getProviderChannel().toString(),
payProviderChannelConfig.getInterfaceCode().toString()))
.getSingleLimitAmount()
)
.serviceName(payProviderChannelConfig.getServiceName()))
.build())
.map(routeBean -> {
if (debitBankConfigMap.containsKey(new StringBuilder().append(routeBean.getProviderChanl())
.append("_")
.append(routeBean.getInterfaceCode())
.toString())) {
} else {
routeBean.setIsSatisfy(false);
routeBean.setConditional("不支持操作");
}
return routeBean;
})
.collect(Collectors.toList());