在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)