将方法保存到变量java 8中

时间:2015-03-23 20:43:17

标签: java lambda java-8

是否可以将方法保存到变量中? 我有一个名为MyFilter的类,它可以过滤不同领域的项目 MyFilter的构造函数应该询问两件事:

  1. 字符串,例如按语言过滤项目,“英语”
  2. 这应该是一种方法
  3. 例如:

    我有一个项目,我想检查语言==字符串是否给过滤器
    所以我需要获得该Item的语言,所以Item.getLanguage()...
    我还需要Item.getTitle(),Item.getId()等等。

    我认为这可能与lambda有关,但我不知道如何。

4 个答案:

答案 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
    }
}

您只需要一个与您要存储的方法的签名相匹配的@FunctionalInterfacejava.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);
    }

}