代码之家  ›  专栏  ›  技术社区  ›  GBlodgett

在一行中将泛型ToIntFunction传递给方法

  •  -2
  • GBlodgett  · 技术社区  · 7 年前

    假设我有几个 List 不同对象的,我想将这些对象映射到 int 值(例如返回 String )所以我可以在 Stream . 所以我创建了一个方法,比如:

    public <T> int foo(List<T> list, ToIntFunction<T> toInt) {
         return list.stream().mapToInt(toInt).max().orElse(Integer.MIN_VALUE);
    }
    

    (注: max 可能是其他终端操作)

    然后我想通过 ToIntFunction 对它。我能做到:

    ToIntFunction<String> length = e -> e.length();
    int bar = foo(list, length);
    

    但是我必须写下 图腾函数 每次我调用这个方法。

    有什么方法可以做到:

    foo(list, new ToIntFunction<String>(e -> e.length()) );  
    //Obviously ToIntFunction is an interface and can't be instantiated 
    

    或者有必要用一个命名变量在两行上执行这个操作吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Ravindra Ranwala    7 年前

    像这样把它作为内联lambda传递,

    foo(Arrays.asList("test"), e -> e.length());
    

    或者这里是更易读的基于引用的方法,

    foo(Arrays.asList("test"), String::length);
    

    这里的诀窍是 ToIntFunction<T> 是单个抽象方法接口,该语言允许您使用lambda表达式创建这些接口的实例。

    上面的lambda表达式只是一个语法糖,它替代了更冗长的匿名内部类。这是Java8之前的方法。

    int bar = foo(Arrays.asList("test"), new ToIntFunction<String>() {
        @Override
        public int applyAsInt(String value) {
            return value.length();
        }
    });