在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的值?
是否可以使用方法参考传递参数?例如,我必须创建一个TreeMap但使用reverseOrder().有类似TreeMap::new(reverseOrder())存在吗?
假设我有这段代码:
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的类.
我有员工类:
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 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
我目前正在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)