一大波List集合骚操作来袭

首先得从今天写出的一个数据处理方法说起,如下

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生成一个流。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值