相关疑难解决方法(0)

java lambda返回一个lambda

我试图在功能编程的新jdk8版本中做一些看起来相对基本的东西,但是无法让它工作.我有这个工作代码:

import java.util.*;
import java.util.concurrent.*;
import java.util.stream.*;

public class so1 {
   public static void main() {
      List<Number> l = new ArrayList<>(Arrays.asList(1, 2, 3));
      List<Callable<Object>> checks = l.stream().
               map(n -> (Callable<Object>) () -> {
                  System.out.println(n);
                  return null;
               }).
               collect(Collectors.toList());
   }
}
Run Code Online (Sandbox Code Playgroud)

它需要一个数字列表并生成一个可以打印出来的函数列表.然而,显式转换为Callable似乎是多余的.对我和IntelliJ来说似乎.我们都同意这也应该有效:

List<Callable<Object>> checks = l.stream().
       map(n -> () -> {
          System.out.println(n);
          return null;
       }).
       collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

so1.java:10: error: incompatible types: cannot infer type-variable(s) R
      List<Callable<Object>> checks = l.stream().map(n -> () -> {System.out.println(n); return null;}).collect(Collectors.toList());
                                                    ^
    (argument mismatch; bad return type …
Run Code Online (Sandbox Code Playgroud)

java lambda functional-programming java-8

21
推荐指数
2
解决办法
7732
查看次数

比较然后比较给出编译错误

我正在尝试List按名称对员工进行排序,然后使用Java8 Comparator,我在下面创建Comparator但是它给了我一个编译器错误

Type mismatch: cannot convert from Comparator<Object> to <unknown>

    Comparator<String> c = Comparator.comparing(s -> s.split("\\s+")[0])
            .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //compile error
Run Code Online (Sandbox Code Playgroud)

但是如果我明确指定Type,它就可以工作

    Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0])
            .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //works
Run Code Online (Sandbox Code Playgroud)

或者通过创建两个Compartors和链

    Comparator<String> name = Comparator.comparing(s -> s.split("\\s+")[0]);
    Comparator<String> age = Comparator.comparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
    Comparator<String> cc = name.thenComparing(age); //works
Run Code Online (Sandbox Code Playgroud)

我已Comparator<String>在左侧指定了类型,但为什么自动类型推断未找到正确的类型并期望明确指定.

有人可以澄清一下吗?

这是代码

    String[] arr = { "alan 25", "mario 30", "alan 19", "mario 25" };
    Comparator<String> c = …
Run Code Online (Sandbox Code Playgroud)

java comparable comparator java-8

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