标签: java-stream

迭代 IntStream 以打印值

在下面的示例中,我正在使用该字段,number即使IntStream.range(0, 10).forEach(number -> new Thread(r).start());它没有被使用。有没有办法重写它,以便我不必使用未使用的数字变量?

    import javax.annotation.concurrent.NotThreadSafe;
    import java.util.stream.IntStream;
    
    public class LearnThreads {
        public static void main(String[] args)  {
            UnsafeThreadClass counter = new UnsafeThreadClass();
            Runnable r = () -> {
                try {
                    System.out.println(counter.getValue() + " : Thread - " +Thread.currentThread());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            IntStream.range(0, 10).forEach(number -> new Thread(r).start());
        }
    }
    
    
    @NotThreadSafe
    class UnsafeThreadClass {
        private int value;
    
        public synchronized int getValue() throws InterruptedException {
            Thread.sleep(1000);
            return value++;
        }
    }
Run Code Online (Sandbox Code Playgroud)

java java-stream java-threads

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

使用对象列表构建不可变地图

我有一个学生列表和一个委托,该委托具有获取给定学生的服务器列表的功能 ( getServersForStudent(student))。我想为每个服务器索引的学生列表创建一个地图。一个学生可以在多个服务器中。

private Map<Server, Student> getStudentsByServer(List<Student> students) {
    Map<Server, List<Student>> map = new HashMap<>();
    students.forEach(student ->
        List<Server> servers = delegate.getServersForStudent(student);
        if (!servers.isEmpty()) {
            servers.forEach(server -> map.putIfAbsent(server, new ArrayList<>()).add(student));   
        }
    );
    return map
}

Run Code Online (Sandbox Code Playgroud)

这工作得很好,但我想重构它以使用流来创建一个不可变的集合。我尝试使用 groupingBy 执行此操作,但无法获得正确的结果:

students
    .stream()
    .collect(
        Collectors.groupingBy(
            student -> delegate.getServersForStudent(student);
            Collectors.mapping(Function.identity(), Collectors.toList())
        )
);
Run Code Online (Sandbox Code Playgroud)

此分组与上面的结果不同,因为它是按列表分组的。有人对如何使用 Java 流最好地做到这一点有任何建议吗?

java java-stream

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

使用 Java Streams 对 int 数组进行排序

我试图熟悉 Java 流以及该领域的类似事物,但无法对 type 的数组进行排序int。这是我的代码,它根本不对数组进行排序。

class Scratch {
   public static void main(String[] args) {
       int [] arr3 = { 9,21,5,8 };
       Comparator<Integer> cc = (e1,e2) -> {
            return e1.compareTo(e2);
       };
       Arrays.stream(arr3).boxed().sorted();
       System.out.println(Arrays.toString(arr3));
   }
}
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

流——中间操作和终端操作之间特殊的操作顺序

import java.util.stream.*;

public class MyClass {
    public static void main(String args[]) {
      Stream.of(1, 2, 3).map(i -> {
          System.out.println(i+":inside map");
          return i+4;
       }).forEach(t->System.out.println(t + ":inside foreach"));
    }
}
Run Code Online (Sandbox Code Playgroud)

// 印刷:

1:inside map
5:inside foreach
2:inside map
6:inside foreach
3:inside map
7:inside foreach
Run Code Online (Sandbox Code Playgroud)

输出不应该是:

1:inside map
2:inside map
3:inside map
5:inside foreach
6:inside foreach
7:inside foreach
Run Code Online (Sandbox Code Playgroud)

我的印象是,每个中间操作结束后,它都会返回一个新的流。所以 foreach 应该得到 (5,6,7) 并因此打印

 5:inside foreach
 6:inside foreach
 7:inside foreach
Run Code Online (Sandbox Code Playgroud)

但案例表明,foreach 是对map 的每个条目一一执行的。这是为什么?

java java-stream

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

如何在 Java 流中使用 if 语句以避免重复的流处理

这是我在 Java MOOC.fi 课程中学习流的代码。下面的代码可以工作,但我编写它的方式相当业余。我正在考虑以某种方式将流中的 if 语句与先前输入中给出的答案的条件集成,以通过更改一行(过滤器方法)来预测该过程。有任何想法吗?

System.out.println("Print the average of the negative numbers or the positive numbers? (n/p)");
String answer = scanner.nextLine();
double average;

if (answer.equals("n")) {
    average = inputs.stream()
            .mapToInt(s -> Integer.valueOf(s))
            .filter(pos -> pos < 0)
            .average()
            .getAsDouble();
} else {
    average = inputs.stream()
            .mapToInt(s -> Integer.valueOf(s))
            .filter(pos -> pos > 0)
            .average()
            .getAsDouble();
}
Run Code Online (Sandbox Code Playgroud)

我尝试过forEach,但我不明白如何使用它。我提供给流的集合是一个ArrayList.

我使用的是 Java 11。

java lambda functional-programming java-stream

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

如何使用 Lambda 将 List&lt;String&gt; 转换为 Map&lt;String, Long&gt;,其中键是字符串,值是元音数量?

鉴于:

List<String> myStrings = Arrays.asList("broom", "monsoon");
Run Code Online (Sandbox Code Playgroud)

返回:

Map<String, Long> stringToNumberOfVowels = Map.of("broom", 2, "monsoon", 3);
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

Map<String, Long> vowelsMap = Stream.of("broom").flatMapToInt(String::chars).filter("aeiou".indexOf(c) >= 0).mapToObj(c -> "aeiou".indexOf(c)>=0 ? "broom" : "").collect(Collectors.groupingBy(Function.indenty(), Collectors.counting()));

for(Map.Entry<String, Long> a : vowelsMap.entrySet()) { System.out.println(a.getKey() + "==>"); System.out.println(a.getValue()); }
Run Code Online (Sandbox Code Playgroud)

我的输出(仅适用于流中传递的 1 个字符串):

扫帚==> 2

期望的输出:

扫帚==> 2

季风==> 3

java lambda dictionary java-stream collectors

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

Stream count不是终端操作吗?

public static void main(String[] args) throws IOException {

    List<String> lst = new ArrayList<>();
    lst.add("Alpha");
    lst.add("Beta");
    lst.add("Gamma");

    String joinResult = lst.stream().peek(x->System.out.println(x)).map(x -> {
        System.out.println("In the middle");return x+"3";}).peek(System.out::println).collect(Collectors.joining());
    System.out.println(joinResult);
}
Run Code Online (Sandbox Code Playgroud)

最后我没有使用collect(Collectors.joining()),而是使用了count()。但是没有打印任何内容。count()没有终端操作吗?count返回的是long,所以应该是这样。真的很奇怪。

上面的代码从头到尾打印每个元素。Alpha -> 中间 ->Alpha3 Beta -> 中间 -> Beta3 依此类推

这就是流的工作原理吗?每个元素都从头到尾进行处理?

java java-stream

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

如何使用 Java 流来映射项目

我是 Java 新手,开始学习java streams. 我已经理解了filter如何使用流,但是理解map正在成为一个挑战。

我有一个Person.java代码

public class Person {

    // Fields
    private String name;
    private int age;
    private String gender;

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

    // Getters
    public String getName() {
        return this.name;
    }
    public int getAge() {
        return this.age;
    }
    public String getGender() {
        return this.gender;
    }

    // Setters
    public void setName(String name) { …
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

如何关闭java.util.Stream并使用终端操作

如果我有一个java.util.Stream需要关闭的(一旦完成),我如何才能既关闭它(通过调用close)又调用一个终端操作,如countor collect

例如:

java.nio.file.Files.lines(FileSystems.getDefault().getPath("myfile.txt"))
        .collect(Collectors.toSet());
        //.close(); ???
Run Code Online (Sandbox Code Playgroud)

(在此示例中,调用close并不重要,但可以说我有一个Stream对象,该对象通过onClose在流中注册了关键的close操作)。

我猜您可以将流存储在temp var中并关闭它,如下所示:

Stream<String> ss = java.nio.file.Files.lines(FileSystems.getDefault().getPath("myfile.txt"));
Set<String> lines = ss.collect(Collectors.toSet());
ss.close();
return lines;
Run Code Online (Sandbox Code Playgroud)

但似乎有点笨拙。以这种方式关闭流是否总是安全的?

java java-stream

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

仅对一个流进行两次检查并过滤

我需要检查类的Id变量是否为null。如果为null,则必须将其插入一个列表中;如果不为null,则必须将其插入另一列表中。我这样做是这样的:

我不希望有两个流,我只想做一个,然后使用Strem和过滤器,您能帮我吗?

具有空ID的电子邮件将保留在数据库中。

List<Email> emails = payment.getUser().getEmails();

if (!emails.isEmpty()){
    List<Email> create = emails.stream().filter(email -> email.getId() == null).collect(Collectors.toList());
    List<Email> existingEmails = emails.stream().filter(email -> email.getId() != null).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

java lambda java-stream

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