标签: java-stream

如何比较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

我有不同的上行动问题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 java-8 java-stream

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

如何在不阻塞使用流的情况下处理队列的所有元素?

假设我有一个Queue<String>,我想清空队列的当前内容并对每个元素做一些事情。使用循环我可以做类似的事情:

while (true) {
    String element = queue.poll();
    if (element == null) {
        return;
    }
    System.out.println(element);
}
Run Code Online (Sandbox Code Playgroud)

这感觉有点丑。我可以用流做得更好吗?

请注意,可能有其他线程同时访问队列,因此依赖队列的大小来知道要轮询的项目数量很容易出错。

java queue java-stream

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

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
查看次数

生成无限并行流

问题

嗨,我有一个函数,我将返回无限的并行流(是的,在这种情况下它要快得多)生成的结果。所以很明显(或不)我用过

Stream<Something> stream = Stream.generate(this::myGenerator).parallel()
Run Code Online (Sandbox Code Playgroud)

它有效,但是......当我想限制结果时它不会(当流是顺序的时一切都很好)。我的意思是,当我做类似的事情时,它会产生结果

stream.peek(System.out::println).limit(2).collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

但即使peek输出产生超过 10 个元素,collect仍然没有最终确定(生成很慢,所以这 10个元素甚至可能需要一分钟)......这是一个简单的例子。实际上,限制这些结果是未来,因为主要期望是在用户终止进程之前只获得比最近的结果更好的结果(其他情况是首先返回我可以通过抛出异常findFirst所做的事情,如果没有其他帮助[没有,即使我在控制台上有更多元素并且在大约 30 秒内没有更多结果])。

所以,问题是...

如何复制?我的想法也是使用 RxJava,还有另一个问题 - 如何使用该工具(或其他工具)实现类似的结果。

代码示例

public Stream<Solution> generateSolutions() {
     final Solution initialSolution = initialSolutionMaker.findSolution();
     return Stream.concat(
          Stream.of(initialSolution),
          Stream.generate(continuousSolutionMaker::findSolution)
    ).parallel();
}

new Solver(instance).generateSolutions()
    .map(Solution::getPurpose)
    .peek(System.out::println)
    .limit(5).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

实施findSolution并不重要。它有一些副作用,比如添加到解决方案仓库(singleton、sych 等),但仅此而已。

java java-8 rx-java java-stream

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

Java8 流 map() 函数中的附加括号

我正在 Java8 中工作/测试流,遇到了非常令人沮丧的问题。我有编译好的代码:

        List<String> words = Arrays.asList("Oracle", "Java", "Magazine");
    List<String> wordLengths = words.stream().map((x) -> x.toUpperCase())
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

第二个(几乎相同)抛出警告:

        List<String> words = Arrays.asList("Oracle", "Java", "Magazine");
    List<String> wordLengths = words.stream().map((x) -> {
        x.toUpperCase();
    }).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

警告:

The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments ((<no type> x) -> {})
Run Code Online (Sandbox Code Playgroud)

这个额外的括号有什么变化?

java-8 java-stream

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

java 8 - 打印按键排序的地图

我正在打印一个按键排序的地图,中间对象 LinkedHashMap 如下;

 LinkedHashMap<String, AtomicInteger> sortedMap = wcMap.entrySet().stream()
            .sorted(Map.Entry.comparingByKey())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (oldValue, newValue) -> oldValue, LinkedHashMap::new));

 sortedMap.forEach((k, v) -> System.out.println(String.format("%s ==>> %d",k, v.get())));
Run Code Online (Sandbox Code Playgroud)

如何在收集之前直接从流中打印它?

java-8 java-stream

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

使用 Java Streams 将 Java ArrayList 转换为 Vector

我知道这是一个更简单的问题。

但是是否可以转换给定的对象列表List<Person>并将其转换为Vector<PersonName>使用Java Streams API

public class Person {        
     String name;
     String lastName;
     int age;
     float salary;
}

public class PersonName {
     String name;
     String lastName;
}
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

使用 Java Streams 从超集中获取子集

我需要从给定的超级列表中获取子列表,如下所述。

假设我有一个“Person”对象的超级列表,如下所示:

List<Person> personsList = new ArrayList<>();
personsList.add(new Person("John", 28));
personsList.add(new Person("Paul", 29));
personsList.add(new Person("Adam", 30));
personsList.add(new Person("Peter", 31));
personsList.add(new Person("Pat", 32));
Run Code Online (Sandbox Code Playgroud)

让 Person 类定义如下:

class Person {
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + ": " + age;
    }
}
Run Code Online (Sandbox Code Playgroud)

给定这样的子列表:

String [] names = {"John", "Paul", "Adam"};
List<String> namesList = Arrays.asList(names);
Run Code Online (Sandbox Code Playgroud)

我想获取名称为John,Paul和的 Person 对象 …

java list arraylist java-8 java-stream

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

使用 Lambda 表达式将列表转换为地图不起作用

我正在尝试将 Student 对象列表转换为一个映射,其中键是整数(即 Student 对象的 rollno 字段),Value 是 Student 对象本身。

以下是我编写的代码:

package fibonacci;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class MApfor {


    public static void main(String[] args) {


        List<Student> maplist=new ArrayList<>();

        maplist.add(new Student(1, "pavan"));
        maplist.add(new Student(2, "Dhoni"));
        maplist.add(new Student(3, "kohli"));

        maplist.forEach(System.out::println);

        Map<Integer,Student> IS=new HashMap<>();



        IS = maplist.stream().collect(Collectors.toMap(a -> a.getRollNo,a);



    }
}
Run Code Online (Sandbox Code Playgroud)

每当我尝试写最后一行时,即

IS = maplist.stream().collect(Collectors.toMap(a -> a.getRollNo,a);
Run Code Online (Sandbox Code Playgroud)

我无法检索 rollNo 字段,eclipse 没有显示建议,即每当我键入 a.get 将 rollNo 分配给键时,我无法这样做。

请提出我面临的问题。

package fibonacci;

public class Student {


    public int rollNo; …
Run Code Online (Sandbox Code Playgroud)

java collections lambda java-8 java-stream

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

标签 统计

java-stream ×10

java ×8

java-8 ×8

lambda ×2

arraylist ×1

collections ×1

list ×1

queue ×1

rx-java ×1