首先得从今天写出的一个数据处理方法说起,如下
private Boolean validateGameGroupGame(List<PtomInvalidPlanRuleVO> validRule, List<String> submitGames, Map<String, String> resultMap, String gameGroupName) {
for (PtomInvalidPlanRuleVO item : validRule) {
String gameIds = item.getGameIds();
if (StringUtils.isNotBlank(gameIds)) {
// Arrays.asList()转换后的List调用方法会直接抛出异常
List<String> incompleteList = Arrays.asList(gameIds.split(","));
List<String> games = new ArrayList<String>(incompleteList );
// ”submitGames“参数集合未发生改变,”games“得到交集后集合
games.retainAll(submitGames);
if (games.size() > 0) {// 游戏组游戏取交集元素大于0则为重复
List<Integer> idsList = games.stream()
.map(e -> Integer.valueOf(e))
.collect(Collectors.toList());// 将String元素转换为Integer
CommonCondition commonCondition = new CommonCondition();
commonCondition.setGameIds(idsList);
List<OpenGameInfo> gameInfo = gameSrv.queryGameByCondition(commonCondition);
// 将对象中游戏名称取出组成新数组
List<String> gameNameList = gameInfo.stream()
.map(e -> e.getGameName())
.collect(Collectors.toList());
// 将字符串数组组合成一个以逗号分割的字符串并过滤重复值与null值
String gameNamesStr = gameNameList.stream()
.filter(Objects::nonNull)
.map(String::valueOf)
.distinct().collect(Collectors.joining(","));
resultMap.put("msg", gameGroupName + "游戏组内游戏(" + gameNamesStr + ")被设置多个规则会造成数据混乱,请做调整!");
return true;
}
}
}
return false;
}
接下来一句一句慢慢分析
// Arrays.asList()转换后的List调用方法会直接抛出异常
List<String> incompleteList = Arrays.asList(gameIds.split(","))
List<String> games = new ArrayList<String>(incompleteList );
这里可能会有同学疑问,都已经Arrays.asList()了得到的不就是一个List嘛,为什么还要new一个ArrayList呢。
没错经过Arrays.asList()转换确实得到的是一个List, 但是这个List他是残缺的,调用相关方法时会直接抛出异常。至于底层原理就是由于数组经过Arrays.asList()转化 返回的是Arrays的内部类ArrayList, 而不是java.util.ArrayList。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,而AbstractList中的方法都是默认throw UnsupportedOperationException不作任何操作的,java.util.ArrayList重写了这些方法,Arrays的内部类ArrayList则没有。
games.retainAll(submitGames);// ”submitGames“参数集合未发生改变,”games“得到交集后集合
这个应该没啥问题,就是标注一下调用方法的List作为结果接受者,而被用来取交集的参数List没有改变。
List<Integer> idsList = games.stream()
.map(e -> Integer.valueOf(e))
.collect(Collectors.toList());// 将String元素转换为Integer
这个就涉及到了jdk1.8新上api流了,流的map方法遍历数组并对数组中每一个元素做出改变,当然这得咱们自己写怎么改变,强行解释一下就是,第一个e代表当前索引位置List元素,“->” 横杠+箭头表示要将此元素变成什么,“->”右边 变化后的元素,这里将每个元素转换为Integer类型,原本是String类型。做完这些还没有结束,虽然类型是转换了,但他还是个流,所以接下来使用collect(Collectors.toList())方法将流转化为对应的List,操作结束。
List<String> gameNameList = gameInfo.stream()
.map(e -> e.getGameName())
.collect(Collectors.toList());// 将对象中游戏名称取出组成新数组
同上
// 将字符串数组组合成一个以逗号分割的字符串并过滤重复值与null值
String gameNamesStr = gameNameList.stream()
.filter(Objects::nonNull)
.map(String::valueOf)
.distinct().collect(Collectors.joining(","));
首先咱们介绍一下流操作之filter()方法,它将没有达到括号内条件的项删除掉,但让得到的还是个流,再调用map方法将元素转化为String类型,distinct()去除重复项,collect(Collectors.joining(","))转化为逗号分割的字符串并返回。
ps:敲黑板,当你的List调用stream()方法时它就不是它了,流操作不改变原List,只是借用原List生成一个流。