是否可以将方法保存到变量中? 我有一个名为MyFilter的类,它可以过滤不同领域的项目 MyFilter的构造函数应该询问两件事:
例如:
我有一个项目,我想检查语言==字符串是否给过滤器
所以我需要获得该Item的语言,所以Item.getLanguage()...
我还需要Item.getTitle(),Item.getId()等等。
我认为这可能与lambda有关,但我不知道如何。
答案 0 :(得分:27)
是的,您可以对任何方法进行变量引用。对于简单的方法,通常使用java.util.function.
类就足够了。对于复杂方法,您必须使用此方法定义@FunctionalInterface
。这是工作示例:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
final Consumer<Integer> simpleReference = Main::someMethod;
simpleReference.accept(1);
simpleReference.accept(2);
simpleReference.accept(3);
final ComplexInterface complexReference = Main::complexMethod;
final String complexResult = complexReference.someMethod("888", 321, new ArrayList<>());
System.out.println(complexResult);
}
private static void someMethod(int value) {
System.out.println(value);
}
private static String complexMethod(String stringValue, int intValue, List<Long> longList) {
final StringBuilder builder = new StringBuilder();
builder.append(stringValue).append(" : ").append(intValue);
for (Long longValue : longList) {
builder.append(longValue);
}
return builder.toString();
}
@FunctionalInterface
public static interface ComplexInterface{
String someMethod(String stringValue, int intValue, List<Long> longList);
}
}
答案 1 :(得分:7)
您可以使用Java 8方法引用。您可以使用::
&#39;运营商&#39;从对象中获取方法引用。
import java.util.function.IntConsumer;
class Test {
private int i;
public Test() { this.i = 0; }
public void inc(int x) { this.i += x; }
public int get() { return this.i; }
public static void main(String[] args) {
Test t = new Test();
IntConsumer c = t::inc;
c.accept(3);
System.out.println(t.get());
// prints 3
}
}
您只需要一个与您要存储的方法的签名相匹配的@FunctionalInterface
。 java.util.function
包含一些最常用的选项。
答案 2 :(得分:0)
您可以使用方法参考,例如 -
System.out::println
这相当于lambda表达式 -
x -> System.out.println(x).
此外,您可以使用反射来存储方法,它也适用于早期版本的java
。
答案 3 :(得分:0)
也许您可以从Java 8中尝试java.util.stream
public class Item {
public Item(int id, String title, String language){
this.id=id;
this.title=title;
this.language=language;
}
private int id;
private String title;
private String language;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
}
以下代码片段显示了如何按流过滤数据:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
List<Item> items = new ArrayList<Item>();
items.add(new Item(1, "t1", "english"));
items.add(new Item(2, "t2", "english"));
items.add(new Item(3, "t3", "Japanese"));
// get items 1 and 2
List<Item> result1 = items.stream()
.filter(n->n.getLanguage()=="english")
.collect(Collectors.toList());
// get item 1
Item result2 = items.stream()
.filter(n->n.getId()==1)
.findFirst().orElse(null);
}
}