我的问题有点复杂(我认为),所以我会尝试使用一个例子。希望你能理解我的问题。
设置说我有一个用户列表:
List<User> users;
Run Code Online (Sandbox Code Playgroud)
在哪里:
public class User{
private List<Car> cars;
}
public class Car{
private String code;
private List<Feature> features;
}
public class Feature{
private String code;
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是从用户列表中获取汽车列表但是我也希望这个列表是不同的(没有具有相同代码的汽车)但是我希望单个 Car 对象具有来自不同汽车的所有功能相同的代码,这就是我失败的地方。
现在我有
List<Car> cars = users
.stream()
.flatMap(user -> user.getCars())
.???
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用 Predicate 通过代码过滤汽车,但我很难为我要离开的汽车添加功能。有没有一种干净的方法来处理流?
有什么方法可以避免在 DOM 中保留空格(无论是哪个 java 库)?
我有一个由 XSD 架构验证的 XML 文件。通过这种模式,只有<text>元素包含文本。另一个元素仅包含元素节点。当我编辑 XML 文件时,对于大多数可见性,我有几种类型的空格,如制表符、空白、回车符、...
如何在不保留所有未经架构授权的空格的情况下解析我的 XML(没有 xslt,只有 java 库)?
我有Stream<SortedSet<String>>,而且我只想拥有一个Stream<String>. 我尝试使用flatMap()但它没有用,因为它不能平面 Sortedset 流。
String productName = "p1";
Set<Product> products = new HashSet<>();
products.add(new Product(productName));
Stream<SortedSet<String>> sortedSetStream = products.stream().map(p -> Util.getProductNames(p) );
Run Code Online (Sandbox Code Playgroud) 我使用流过滤器从请求对象中获取两个日期。在那里我必须比较这些对象,然后将它们收集到列表中。但现在我得到这个错误。请帮我解决。
错误:
类型不匹配:无法从 int 转换为 boolean
代码:
Date checkIn = req.getCheckIn();
Date checkOut = req.getCheckOut();
List<PlaceBook> filtered = checkInVal.stream().filter(string ->
string.getCheckInDt().compareTo(checkIn)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud) 我有不同的上行动问题stream的String的。
Stream<String> names = Arrays.asList("NAME A", "NAME B", "NAME A").stream();
names.distinct();
System.out.println(names.collect(Collectors.joining(",")));
Run Code Online (Sandbox Code Playgroud)
然后,我收到异常:
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.Test.main(Test.java:62)
Run Code Online (Sandbox Code Playgroud)
但是如果我这样写这部分代码:
Stream<String> names = Arrays.asList("NAME A", "NAME B", "NAME A").stream();
final Stream<String> distinct = names.distinct();
System.out.println(distinct.collect(Collectors.joining(",")));
Run Code Online (Sandbox Code Playgroud)
一切都好。
独特的文档说:
Stream distinct() 返回由该流的不同元素(根据 Object.equals(Object))组成的流。对于有序流,不同元素的选择是稳定的(对于重复元素,保留遇到顺序中最先出现的元素。)对于无序流,没有稳定性保证。这是一个有状态的中间操作。
我做错了什么?
感谢帮助
我正在尝试使用 java.time.LocalDate 中的 plusMonths API。通过java doc,很明显,日期会针对任何无效的超过日期进行调整。
例如 31-03-2017 + 1 Month = 31-04-2017--> 30-04-2017(因为 4 月 31 日无效)。
但是,当我尝试将 API 用于二月的日期时,它不会返回下个月的最后一天(例如三月),而是在添加 30 天后返回日期。
例如 28-02-2017 + 1 个月 = 29-03-2017(预计 31-03-2017)。
public class AddMonthTest {
public static void main(String[] args) {
System.out.println(LocalDate.of(2017, 02, 28).plusMonths(1));
}
Run Code Online (Sandbox Code Playgroud)
给出输出: 2017-03-28 其中预期它应该返回 31-03-2017。
我有一些看起来像这样的代码(这里简化了):
public Optional<String> parseInput(String input){
Pattern pattern = Pattern.compile("([A-Za-z]+)([0-9]{2}|[0-9]{4})");
Matcher matcher = pattern.matcher(input);
return Optional.of(matcher.find())
.filter(t -> t) // .filter(Function.identity())
.map(ignore -> matcher.group(1));
}
Run Code Online (Sandbox Code Playgroud)
但它失败并出现错误:
Error: incompatible types: no instance(s) of type variable(s) T exist so that java.util.function.Function<T,T> conforms to java.util.function.Predicate<? super java.lang.Boolean>
这里发生了什么,为什么要这样设计?
我有两个清单。第一个是区域的 ID 列表,第二个是具有嵌套区域对象的节点列表。
我的结构nodeList:
....{
"id": 6412,
"name": "303000201",
"description": "desc",
"organization": {
"id": 41065,
"name": "adad",
"address": null
},
"region": {
"id": 21,
"name": "Quba rayonu",
"code": "303"
},
"nodeType": {
"id": "WELL",
"name": "Quyu",
"description": null
},
"location": {
"id": 6412,
"latitude": 41.36735554,
"longitude": 48.5041245554
}} ......
Run Code Online (Sandbox Code Playgroud)
和地区列表:
{
"regions": ["56", "44"]
}
Run Code Online (Sandbox Code Playgroud)
我必须过滤我nodeList的区域 ID。我用旧的方式来做,但我想用 lambda 表达式来做。我该怎么做?
我用谷歌搜索,尝试过,但它不起作用:/
result= nodeList.stream()
.filter(n -> regionIDList.equals(n.getRegion().getId().toString()))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
先感谢您。
我在一些代码库中看到了下面的代码,我不确定如何为 String 返回类型返回 Optional 。
public String generateTemplate() {
Optional<String> template = Optional.ofNullable(lenderAndTemplateMap.get("LENDER_1"));
return template.orElse("TEMPLATE_2");
}
Run Code Online (Sandbox Code Playgroud) 我知道如何转换List<Object>成Map<String,String>你可以在这个代码中看到:
Map<Long, String> divMap = divs.stream()
.collect(Collectors.toMap(Div::getId, Div::getName));
Run Code Online (Sandbox Code Playgroud)
这个的输出是:
“1”:“A”,“2”:“B”
但我想返回List<Map<String,String>>
下面给出的输出:
["id":"1",Name="A"] ["id":"2",Name="B"]
java ×10
java-8 ×10
java-stream ×5
lambda ×2
collections ×1
date ×1
filter ×1
list ×1
optional ×1
xml ×1
xml-parsing ×1
xsd ×1