标签: java-8

为什么没有Stream.flatMap(Collection)方法?

目前,要将a转换List<List<Foo>>为a Stream<Foo>,您必须使用以下内容:

Stream<Foo> stream = list.stream().flatMap(fs -> fs.stream());
//or
Stream<Foo> stream = list.stream().flatMap(Collection::stream);
Run Code Online (Sandbox Code Playgroud)

我认为这正是方法引用的设计目标,它确实提高了可读性.现在考虑一下:

Stream<Bar> stream = list.stream().flatMap(fs -> fs.getBarList().stream());
Run Code Online (Sandbox Code Playgroud)

有两个链式方法调用,没有方法参考是可能的,我已经发生了几次这种情况.虽然这不是一个大问题,但它似乎偏离了方法参考简洁性.

在使用JavaFX 8之后,我注意到它们的API常量是方便的方法.Java是一种非常冗长的语言,在我看来,简单的方法重载是JavaFX的一大卖点.

所以我的问题是,我想知道为什么没有Stream.flatMap(Collection)可以被称为的方便方法:

Stream<Bar> stream = list.stream().flatMap(Foo::getBarList);
Run Code Online (Sandbox Code Playgroud)

这是甲骨文人员故意遗漏的吗?或者这会引起任何混淆吗?

注意:我知道"不基于意见的问题政策",我不是在寻找意见,我只是想知道是否有理由不采用这种方法.

java overloading java-8 java-stream

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

如何在JAVA8 lambda中对条件进行排序

我正在使用Java-8 lambda对列表进行排序.

这是列表

[(t1, tester1), (t4, tester4), (t3, tester3), (t2, tester2)]
Run Code Online (Sandbox Code Playgroud)

排序后

[(t2, tester2), (t1, tester1), (t3, tester3), (t4, tester4)]
Run Code Online (Sandbox Code Playgroud)

我想得到如上所述的结果

String specialId = 't2'

List<Test> list = new ArrayList<>();

Test test1 = new Test();
test1.setId = "t1"
test1.setName = "tester1"
list.add(test1)

Test test2 = new Test();
test2.setId = "t4"
test2.setName = "tester4"
list.add(test2)

Test test3 = new Test();
test3.setId = "t3"
test3.setName = "tester3"
list.add(test3)

Test test4 = new Test();
test4.setId = "t2"
test4.setName = "tester2"
list.add(test4)

Stream<Test> s1 …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

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

如何将两个java8流操作 - 一个终端和一个懒惰 - 组合到一个操作中?

我正在做一些Java 8流的"代数",也就是说,我正在尝试编写一个简单的操作Op,它将两个流作为输入并产生另一个流.

所以我有这个简单的代码,其目的是在一系列数字中打印secund最高值:

import java.util.Arrays;
import java.util.stream.IntStream;

public class SecundHighestValue {

    public static void main(String[] args) {

        //setting the input parameters
        int [] numbers = {1, 2, 3, 4, 3, 4, 2, 1};

        IntStream S1 = Arrays.stream(numbers);
        IntStream S2 = Arrays.stream(new int[] {Arrays.stream(numbers).max().getAsInt()} );

        // setting the operation
        IntStream S3 = S1.filter(x-> x != S2.toArray()[0]); // doesn't work

        /*** does work  ***
        int  maxNumber = S2.toArray()[0];
        IntStream S3 = S1.filter(x-> x != maxNumber);
        */

        // accessing the operation's result stream …
Run Code Online (Sandbox Code Playgroud)

java functional-programming lazy-evaluation java-8 java-stream

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

为什么类中的Optional成员变量的默认值为null?

import java.util.Optional;

public class Student {
   public long id;
   public String firstName;
   public Optional<String> middleName;
   public String lastName;
   .
   .
   .
   public Optional<String> getMiddleName() {
     return middleName;
   }
}

Student student = new Student();
if (student.getMiddleName().isPresent()) {
   System.out.println(student.getMiddleName().get());
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将获得一个,NullPointerException因为Optional类成员值的默认值为null.应该是默认值Optional.empty()吗?

java java-8

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

将Double转换为OptionalDouble的方法

我有一个构建列表的新方法,我希望它将列表的总和作为OptionalDouble值返回.

但是,当我使用Java 8计算总和值时,我总是将返回值作为Double.

我该如何转换?

Double to OptionalDouble
Run Code Online (Sandbox Code Playgroud)

以下是我的和计算代码:

private static OptionalDouble sumListValue() {
     // Build list
     List<Double> testList = new ArrayList<>();
     testList.add(...);
     ...
     ...


     return testList.stream().mapToDouble(value -> value).sum();
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

java sum optional java-8

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

Java 8 Lambda问题在递增计数时有效最终

我想在下面的场景中使用Java 8 Lambda表达式,但我得到的是在封闭范围内定义的局部变量fooCount必须是final或者有效的final.我理解的错误消息说什么,但我需要计算在这里比例,从而需要增加fooCountbarCount再计算百分比.那么实现它的方法是什么:

        // key is a String with values like "FOO;SomethinElse" and value is Long
        final Map<String, Long> map = null;
    ....
    private int calculateFooPercentage() {
        long fooCount = 0L;
        long barCount = 0L;

        map.forEach((k, v) -> {
            if (k.contains("FOO")) {
                fooCount++;
            } else {
                barCount++;
            }
        });

        final int fooPercentage = 0;
        //Rest of the logic to calculate percentage
        ....
        return fooPercentage;
    }
Run Code Online (Sandbox Code Playgroud)

我有一个选择是在AtomicLong这里使用而不是long但我想避免它,所以稍后如果可能的话我想在这里使用并行流.

java lambda final java-8

0
推荐指数
2
解决办法
1070
查看次数

实例化具有默认方法的接口

我遇到了这个问题:

以下是什么输出?

1  public class A {
2      public static void main(String[] args){
3          I i = new I() {};
4          System.out.println(I.x + i.getValue() + "" + i);
5      }
6  }
7
8  interface I {
9      int x = 10;
10
11     public default int getValue() {
12         return 5;
13     }
14
15     public default String toString() {
16         return "I";
17     }
18 }
Run Code Online (Sandbox Code Playgroud)

我的想法:

我的第一直觉告诉我 - 我是新的我(){}?因此我们无法实例化接口 - 问题1.

然后我认为公共默认String toString()?重写Object类方法?问题听起来不错 - …

java interface object java-8

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

如何获取Java 8中所有时区ID的列表?

java.time软件包中,我没有看到获取可用时区ID列表的函数。我能够调用getAvailableIDs()java.util.TimeZone库。但是,我想改用Java 8。

有没有办法做到这一点?

java java-8

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

在Java中简化if语句的方法

我目前有一个这样的if语句:

if (condition1 || condition2) {
     //Do stuff here
     //Small things happened here
     //More stuff

     if (condition1) {
          System.out.println("Thank");
          // Do Task Alpha
          // Do Task Beta
     } else {
          System.out.println("You");
          // Do Task Delta
          // Do Task Gamma
     }
}
Run Code Online (Sandbox Code Playgroud)

所以基本的想法是当任一条件为真时发生if语句(在我的情况下,两个条件不能同时为真).

但是,一旦在if语句中,有一个点,如果第一个条件为真,则打印"Thank"并执行Task Alpha和Beta.如果第二个条件为真,则打印"你"并执行任务Delta和Gamma.在我们达到这个分歧点之前,会执行许多常见的陈述.

这是编写整个if语句的最佳/最简单的方法吗?

谢谢.

java if-statement java-8

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

Java流 - 查找唯一元素

我有List<Person> persons = new ArrayList<>();,我想列出所有独特的名字.我的意思是如果有"John","Max","John","Greg"那么我只想列出"Max"和"Greg".有没有办法用Java流做到这一点?

java java-8 java-stream

0
推荐指数
4
解决办法
5553
查看次数