Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。
话不多说,直接上代码:
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @author: Meng
* @date: 2020/2/29 11:29 上午
**/
@Data
public class CallbackVo implements Serializable {
/**
* 付款单单号集合
*/
private List<String> paymentNoList;
/**
* 结算系统的结算单号
*/
private String settleNo;
/**
* 毫秒时间戳
*/
private String settleTime;
/**
* SUCCESS/FAIL
*/
private String settleResult;
/**
* 金额
*/
private int Amount;
}
主程序:
package com.code.study.example.stream;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author: Meng
* @date: 2020/2/29 11:29 上午
**/
public class MainTest {
public final static String SUCCESS = "SUCCESS";
public final static String FAIL = "FAIL";
public static void main(String[] args) {
CallbackVo callbackVo = new CallbackVo();
List<String> paymentNoList = Arrays.asList("test1","test2","test3");
callbackVo.setPaymentNoList(paymentNoList);
callbackVo.setSettleNo("js1234");
callbackVo.setSettleTime(System.currentTimeMillis()+"");
callbackVo.setSettleResult(MainTest.SUCCESS);
callbackVo.setAmount(177);
CallbackVo callbackVo1 = new CallbackVo();
List<String> paymentNoList1 = Arrays.asList("no","no2","no3");
callbackVo1.setPaymentNoList(paymentNoList1);
callbackVo1.setSettleNo("zftest");
callbackVo1.setSettleTime(System.currentTimeMillis()+"");
callbackVo1.setSettleResult(MainTest.FAIL);
callbackVo1.setAmount(166);
CallbackVo callbackVo2 = new CallbackVo();
List<String> pay = Arrays.asList("alal","shss","rer","shanxian");
callbackVo2.setPaymentNoList(pay);
callbackVo2.setSettleNo("ma3232");
callbackVo2.setSettleTime(System.currentTimeMillis()+"");
callbackVo2.setSettleResult(MainTest.SUCCESS);
callbackVo2.setAmount(158);
CallbackVo callbackVo4 = new CallbackVo();
List<String> paymentNoList4 = Arrays.asList("q","w","e","r");
callbackVo4.setPaymentNoList(paymentNoList4);
callbackVo4.setSettleNo("jqtest");
callbackVo4.setSettleTime(System.currentTimeMillis()+"");
callbackVo4.setSettleResult(MainTest.FAIL);
callbackVo4.setAmount(200);
List<CallbackVo> paramList = new ArrayList<>();
paramList.add(callbackVo);
paramList.add(callbackVo1);
paramList.add(callbackVo2);
paramList.add(callbackVo4);
//过滤 筛选集合元素
List<CallbackVo> callbackVoList = paramList.stream()
// .filter(t -> !Objects.equals(t.getSettleResult(), MainTest.FAIL)) //改行代码用于过滤结算结果为失败的数据
.filter(t -> t.getSettleResult().equals(MainTest.FAIL)) // 和上述代码效果一致
.collect(Collectors.toList());
System.out.println("callbackVoList: "+callbackVoList);
System.out.println("=================================");
//获取paramList 中所有settleNo的集合
List<String> settleNoList = paramList.stream().map(CallbackVo::getSettleNo).collect(Collectors.toList());
System.out.println("settleNoList: "+settleNoList);
System.out.println("=================================");
//获取paramList中筛选结算结果为成功的所有settleNo的集合
List<String> settleNoSuccessList = paramList.stream()
.filter(t -> !Objects.equals(t.getSettleResult(), MainTest.FAIL))
// .map(CallbackVo::getSettleNo)
.map(a -> a.getSettleNo()) //和上述代码效果一样
.collect(Collectors.toList());
System.out.println("settleNoSuccessList: "+settleNoSuccessList);
System.out.println("=================================");
//对集合元素进行排序 todo 升序
List<CallbackVo> callbackSortList = paramList.stream()
.sorted(Comparator.comparing(CallbackVo::getAmount))
.collect(Collectors.toList());
System.out.println("+callbackSortList: "+callbackSortList);
System.out.println("=================================");
// 累计求和
int sum = paramList.stream().mapToInt(t -> t.getAmount()).sum();
System.out.println("sum: "+sum);
System.out.println("=================================");
//将数组转换成流
Integer[] nums = {4,6,8,12,24};
Stream<Integer> streamArr = Arrays.stream(nums);
List<Integer> intArr = streamArr.collect(Collectors.toList());
System.out.println("streamArr: "+intArr);
System.out.println("=================================");
Stream<String> stream = Stream.of("one", "two", "three", "four");
// 1. 转换为数组
// String[] strArray1 = stream.toArray(String[]::new);
// 2. 转换为集合
// List<String> list1 = stream.collect(Collectors.toList());
// List<String> list2 = stream.collect(Collectors.toCollection(ArrayList::new));
// Set set1 = stream.collect(Collectors.toSet());
// Stack stack1 = stream.collect(Collectors.toCollection(Stack::new));
// 3. 转为String todo list1 list2 str 不能同时测试,因为这一个流不允许支持3中操作
String str = stream.collect(Collectors.joining(",")).toString();
// System.out.println(list1);
// System.out.println(list2); //todo list1和list2输出一致均为: [one, two, three, four]
// System.out.println(str); //TODO one,two,three,four
}
}