标签: java-8

Java 8 Stream - 对集合中具有相同 id 的对象进行操作

我的问题有点复杂(我认为),所以我会尝试使用一个例子。希望你能理解我的问题。

设置说我有一个用户列表:

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 通过代码过滤汽车,但我很难为我要离开的汽车添加功能。有没有一种干净的方法来处理流?

java collections java-8 java-stream

1
推荐指数
1
解决办法
2623
查看次数

DOM 避免保留空格

有什么方法可以避免在 DOM 中保留空格(无论是哪个 java 库)?

我有一个由 XSD 架构验证的 XML 文件。通过这种模式,只有<text>元素包含文本。另一个元素仅包含元素节点。当我编辑 XML 文件时,对于大多数可见性,我有几种类型的空格,如制表符、空白、回车符、...

如何在不保留所有未经架构授权的空格的情况下解析我的 XML(没有 xslt,只有 java 库)?

java xml xsd xml-parsing java-8

1
推荐指数
1
解决办法
1746
查看次数

如何使用 Stream.flatMap()?

我有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)

java java-8 java-stream

1
推荐指数
1
解决办法
454
查看次数

如何比较java 8中流过滤器中的两个日期?

我使用流过滤器从请求对象中获取两个日期。在那里我必须比较这些对象,然后将它们收集到列表中。但现在我得到这个错误。请帮我解决。

错误:

类型不匹配:无法从 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)

java java-8 java-stream

1
推荐指数
1
解决办法
1万
查看次数

Java 8 - 字符串流不同 - IllegalStateException

我有不同的上行动问题streamString的。

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 java-8 java-stream

1
推荐指数
1
解决办法
1842
查看次数

LocalDate.plusMonth 给出了错误的二月结果

我正在尝试使用 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。

java date java-8

1
推荐指数
1
解决办法
1082
查看次数

为什么我不能在 Optional.filter 的参数中用 Function.identity() 替换 (t -&gt; t) ?

我有一些看起来像这样的代码(这里简化了):

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>

这里发生了什么,为什么要这样设计?

java java-8

1
推荐指数
2
解决办法
2578
查看次数

Java 8 Lambda - 过滤两个 ArrayList

我有两个清单。第一个是区域的 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)

先感谢您。

java lambda list filter java-8

1
推荐指数
1
解决办法
5944
查看次数

Java 8 可选的返回类型

我在一些代码库中看到了下面的代码,我不确定如何为 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)

java optional java-8

1
推荐指数
1
解决办法
1708
查看次数

java8中如何将List&lt;Object&gt;转换成List&lt;Map&lt;String,String&gt;&gt;

我知道如何转换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 lambda java-8 java-stream

1
推荐指数
1
解决办法
3278
查看次数

标签 统计

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