Java Stream中拆分字符串、创建对象并与预设对象比较的实现疑问
嘿,我来帮你理顺这个Java Stream的问题!咱们一步步拆解需求,修正代码里的问题,写出符合预期的实现:
解决你的Java Stream处理需求
首先,先梳理下你现有代码里的几个关键问题,再给出完整的正确实现:
先修正代码里的核心问题
filter(xml->xml.getName()):filter需要返回布尔值,你直接返回字符串会编译报错,得改成判断条件(比如判断字符串非空、包含分隔符等)map(returnedString -> split("__")):调用split方法必须通过字符串对象,应该写成returnedString.split("__")- 直接用拆分后的数组创建
TestObj有风险:如果字符串格式不对,拆分后数组长度不够会抛出数组越界异常,建议先做格式校验
完整实现示例
假设你的预设对象是presetTestObj,下面是安全且符合需求的Stream流程:
// 先定义你的预设对象 TestObj presetTestObj = new TestObj("预设前缀", "预设后缀"); // 示例1:收集所有和预设对象匹配的TestObj List<TestObj> matchedObjects = xmlstream.stream() // 1. 过滤出name非空且包含__分隔符的xml对象 .filter(xml -> xml.getName() != null && xml.getName().contains("__")) // 2. 提取name字符串并拆分成数组 .map(xml -> xml.getName().split("__")) // 3. 校验拆分后的数组长度为2,避免数组越界 .filter(splitArr -> splitArr.length == 2) // 4. 用拆分后的元素创建TestObj(trim按需去掉前后空格) .map(splitArr -> new TestObj(splitArr[0].trim(), splitArr[1].trim())) // 5. 和预设对象比较,筛选出匹配的对象 .filter(testObj -> testObj.equals(presetTestObj)) // 6. 收集结果(按需选择toList/findFirst等) .collect(Collectors.toList()); // 示例2:仅判断是否存在匹配的对象 boolean hasMatchingObj = xmlstream.stream() .filter(xml -> xml.getName() != null && xml.getName().contains("__")) .map(xml -> xml.getName().split("__")) .filter(splitArr -> splitArr.length == 2) .map(splitArr -> new TestObj(splitArr[0], splitArr[1])) .anyMatch(testObj -> testObj.equals(presetTestObj));
关键细节提醒
- 如果你用
equals比较对象,一定要确保TestObj类正确重写了equals和hashCode方法,否则默认比较的是对象引用,不是内容! - 如果预设对象的比较逻辑不是全字段匹配,你可以替换成自定义判断,比如:
.filter(testObj -> testObj.getFirstField().equals(presetTestObj.getFirstField()) && testObj.getSecondField().contains(presetTestObj.getSecondField()))
内容的提问来源于stack exchange,提问作者Maxsteel
相关产品推荐
相关产品推荐

