实现匿名函数的匿名接口的java语法

时间:2015-11-10 17:31:28

标签: java lambda interface

我的界面看起来像

public interface ListAbstractor
{
    List<String> getList();
    void addTo(String s);
}

我想将它用于对具有多个List<String> get_xxxxvoid addToList(String)函数的类进行get / set / verify操作的单元测试。我想用最少量的废物来声明它(我就是这样)。

我已经看到examples接口(使用一种方法)在可爱的一行lambda中实现:

interface IntegerMath {
    int operation(int a, int b);   
}

...
IntegerMath addition = (a, b) -> a + b;

我想实现它:

ListAbstractor la  = 
                new ListAbstractor()
                {
                    getList = ()-> settings.getZooKeeperList();
                    addTo = (s)-> settings.addToZookeeperList(s);
                };

但是eclipse不喜欢这个。那么这种短暂的最甜蜜的做法是什么?

2 个答案:

答案 0 :(得分:2)

常见的解决方案是在界面中创建一个特殊的静态方法来构造实例:

import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

public interface ListAbstractor {
    List<String> getList();
    void addTo(String s);

    public static ListAbstractor of(Supplier<List<String>> listSupplier,
                                    Consumer<String> adder) {
        return new ListAbstractor() {
            @Override
            public List<String> getList() {
                return listSupplier.get();
            }

            @Override
            public void addTo(String s) {
                adder.accept(s);
            }
        };
    }
}

无需创建其他功能接口,因为您可以重复使用标准接口。在Collector.of静态方法中实现了一些类似的方法。

现在你可以写:

myTestFunction(ListAbstractor.of(settings::getZooKeeperList, settings::addToZookeeperList));

答案 1 :(得分:1)

我最终做的是将接口分成两个接口。这实际上比我想做的更少代码,所以赢。

myTestFunction(()-> settings.getZooKeeperList(),
                (s)-> settings.addToZookeeperList(s));