相关疑难解决方法(0)

带参数的方法引用

在Java 8中,使用以下类

 class Person {

    private boolean born;

    Person() {
    }

    public void setBornTrue() {
        born = true;
    }

    public void setBorn(boolean state) {
        born = state;
    }

  }
Run Code Online (Sandbox Code Playgroud)

可以通过方法引用调用setBornTrue方法:

    ArrayList<Person> people = new ArrayList<>();
    people.add(new Person());

    people.forEach(Person::setBornTrue);
Run Code Online (Sandbox Code Playgroud)

但是我如何使用forEach方法并使用方法引用来使用setBorn ?试:

    people.forEach(Person::setBorn);
Run Code Online (Sandbox Code Playgroud)

导致错误,"无法解析方法setBorn".

另外,我如何传递True的值?

java lambda

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

方法参考中的参数

是否可以使用方法参考传递参数?例如,我必须创建一个TreeMap但使用reverseOrder().有类似TreeMap::new(reverseOrder())存在吗?

java lambda java-8 method-reference

4
推荐指数
2
解决办法
2706
查看次数

将键值映射到Java 8流中的对象

假设我有这段代码:

Map<String, String> map;
// later on
map.entrySet().stream().map(MyObject::new).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我有一个MyObject Constructor类型的两个参数String.我希望能够做到这一点,但我做不到.我知道我可以做e -> new MyObject(e.getKey(), e.getValue())但更喜欢MyObject::new.

类似的代码可用于Set<String>List<String>与一个参数的构造函数MyObject的类.

java mapping constructor java-8 java-stream

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

在lambda表达式中使用参数调用构造函数

我有员工类:

public class Employee {

    private Long id;
    private String name;
    private String externalId;

    public Employee(Long id, String name, String externalId) {
        this.id = id;
        this.name = name;
        this.externalId = externalId;
    }

    //getters, setter
}
Run Code Online (Sandbox Code Playgroud)

返回员工的员工服务(可以为NULL).

private void performEmployeeProcessing() {
    Long employeeId = 2L;
    Object o = Optional.ofNullable(employeeService.getById(employeeId))
        .orElseGet(Employee::new, 1L, "", "");

    System.out.println(o);
}
Run Code Online (Sandbox Code Playgroud)

它说编译错误

Employee :: new,1L,"",""
无法解析构造函数.

java lambda

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

构造函数引用和调用构造函数的lambda表达式之间有什么区别?

我正在研究Java 8中的Stream API,我遇到了一个问题.问题是我试图理解 以下代码之间()->new StringBuilder和 之间的差异StringBuilder::new:

Stream<String> stream = Stream.of(new String[]{"b", "a", "s", "i", "l",});
StringBuilder basil = stream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);
System.out.println("basil");
Run Code Online (Sandbox Code Playgroud)

Stream<String> stream = Stream.of(new String[]{"b", "a", "s", "i", "l",});
    StringBuilder basil = stream.collect(()->new StringBuilder(), StringBuilder::append, StringBuilder::append);
    System.out.println("basil");
Run Code Online (Sandbox Code Playgroud)

我何时应该使用第一种语法,何时应该选择第二种语法?

为什么上面的代码接受StringBuilder::append并且不接受StringBuilder::reverse

java java-8 java-stream

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

Java Lambda表达式

我目前正在JDK 1.8上学习lambda表达式.我遇到了一些我发现我不理解的代码.

这是代码:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.lang.Comparable;

/**
 * Hello world!
 *
 */
public class App
{
    public static void main( String[] args ) throws Exception
    {

        List<String> list = Arrays.asList("a", "b", "c");
        sort(list, Comparable::<String>compareTo);

    }

    interface MyComparable {
        public <T extends Comparable<T>> int compare(T obj1, T obj2 );
    }

    public static <T extends Comparable<T>> void sort(List<T> list, MyComparable comp) {

        int n = comp.compare("5","2");
        System.out.println(n);
    }

}
Run Code Online (Sandbox Code Playgroud)

comp.compare("5", "3")最终执行"5".compareTo("2").我的理解是编译器需要找到一个具有相同签名的静态方法

public <T extends …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 method-reference

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