Java扁平化嵌套数组的对象——即将其展开成多个不带数组的对象(使用Stream)

需求:

Java Bean:(模拟调查问卷活动需要的bean)

// 省略getter、setter及构造方法
// 调查对象
public class ActivityObject {
	// 调查名称
	private String name;
	// 问题列表
	private List<QuestionObject> questionObjectList;
}

// 问题对象
public class QuestionObject {
	// 问题名称
	private String questionName;
	// 问题选项列表
	private List<OptionObject> optionObjectList;
}

// 选项对象
public class OptionObject {
	// 选项名称
	private String optionName;
	// 选项答案(可能多选)
	private String[] results;
}

最终需要的Java Bean:

public class FinalObject {
	private String name;
	private String questionName;
	private String optinName;
	private String result;
}

最简单的多重for循环的写法:

public List<FinalObject> convertToFinalObjects(ActivityObject activityObject) {
	List<FinalObject> finalObjects = new ArrayList<>();
	for (QuestionObject qo : activityObject.getQuestionObjectList()) {
		for (OptionObject oo : qo.getOptionObjectList()) {
			for (String result : oo.getResults()) {
				FinalObject fo = new FinalObject(activityObject.getName(),
					qo.getQuestionName(), oo.getOptionName(), result);
				finalObjects.add(fo);
			}
		}
	}
	return finalObjects;
}

3重for循环,看着让人烦!!!

使用Stream API:

public List<FinalObject> convertToFinalObjects(ActivityObject activityObject) {
	List<FinalObject> finalObjects = Stream.of(activityObject)
	.flatMap(ao -> ao.getQuestionObjectList().stream()
	.flatMap(qo -> qo.getOptionObjectList().stream()
	.flatMap(oo -> Arrays.stream(oo.getResults())
	.map(result -> new FinalObject(activityObject.getName(),
					qo.getQuestionName(), oo.getOptionName(), result)))))
	.collect(Collectors.toList());
	
	return finalObjects;
}

参考至:http://cn.voidcc.com/question/p-vwzwpuie-bnn.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值