标签: lambda

如何在Kotlin中创建匿名接口的实例?

我有一个第三方Java库,其对象具有如下界面:

public interface Handler<C> {
  void call(C context) throws Exception;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能在Kotlin中简洁地实现它,就像这样的Java匿名类:

Handler<MyContext> handler = new Handler<MyContext> {
   @Override
   public void call(MyContext context) throws Exception {
      System.out.println("Hello world");
   }
}

handler.call(myContext) // Prints "Hello world"
Run Code Online (Sandbox Code Playgroud)

java lambda anonymous kotlin

68
推荐指数
3
解决办法
3万
查看次数

Java 8传递方法作为参数

目前正在进入Java 8 lambda表达式和方法引用.

我想传递一个没有args且没有返回值的方法作为另一个方法的参数.这就是我这样做的方式:

public void one() {
    System.out.println("one()");
}

public void pass() {
    run(this::one);
}

public void run(final Function function) {
    function.call();
}

@FunctionalInterface
interface Function {
    void call();
}
Run Code Online (Sandbox Code Playgroud)

我知道有一组预定义功能接口在java.util.function诸如Function<T,R>,但我没有找到一个不带任何参数,而不是产生结果.

java lambda java-8 method-reference

67
推荐指数
2
解决办法
8万
查看次数

Java 8与Java 9中的Stream.peek()方法

我正在学习Java 8 lambda表达式的过程,并且想问一下peek我遇到的与函数接口中的方法有关的以下Java代码.

在IDE上执行程序时,它不提供输出.我原以为它会给2, 4, 6.

import java.util.Arrays;
import java.util.List;

public class Test_Q3 {

    public Test_Q3() {
    }

    public static void main(String[] args) {
        List<Integer> values = Arrays.asList(1, 2, 3);
        values.stream()
              .map(n -> n * 2)
              .peek(System.out::print)
              .count();
    }
}
Run Code Online (Sandbox Code Playgroud)

java lambda peek java-8 java-9

67
推荐指数
2
解决办法
4860
查看次数

66
推荐指数
2
解决办法
2万
查看次数

C++ lambda表达式的生命周期是多少?

(我已经阅读了C++中lambda派生的隐式仿函数的生命周期是什么?已经没有回答这个问题了.)

我理解C++ lambda语法只是用于创建具有调用操作符和某个状态的匿名类的实例的糖,并且我理解该状态的生存期要求(由您是否通过引用的值捕获来决定.)但是什么是lambda对象本身的生命周期?在以下示例中,std::function返回的实例是否有用?

std::function<int(int)> meta_add(int x) {
    auto add = [x](int y) { return x + y; };
    return add;
}
Run Code Online (Sandbox Code Playgroud)

如果是,它是如何工作的?这对我来说似乎有点太神奇了 - 我只能通过std::function复制整个实例来实现它的工作,根据我捕获的内容,这可能非常繁重 - 过去我std::function主要使用裸函数指针,复制它们是快.鉴于std::function类型擦除,它似乎也有问题.

c++ lambda c++11

66
推荐指数
4
解决办法
2万
查看次数

Go有lambda表达式或类似的东西吗?

Go支持lambda表达式或类似的东西吗?

我想从另一种使用lambda表达式(Ruby)的语言中移植一个库.

lambda go

66
推荐指数
4
解决办法
5万
查看次数

Java 8中"功能接口"的精确定义

最近我开始探索Java 8,我无法理解Java功能实现lambda表达式所必需的"功能接口"的概念.有一个非常全面的 Java函数中的lambda函数指南,但我仍然坚持用于定义函数接口概念的章节.定义如下:

更确切地说,功能接口被定义为具有恰好一个抽象方法的任何接口.

然后他进入示例,其中一个是Comparator界面:

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
} 
Run Code Online (Sandbox Code Playgroud)

我能够测试我可以使用lambda函数代替Comparator参数,它可以工作(即Collections.sort(list, (a, b) -> a-b)).

但是在Comparator接口中,两者compare和equals方法都是抽象的,这意味着它有两个抽象方法.那么如果定义要求接口只有一个抽象方法,那么它如何工作呢?我在这里错过了什么?

lambda abstract java-8 functional-interface

66
推荐指数
2
解决办法
7707
查看次数

Java8 Lambdas和Exceptions

我想知道是否有人可以向我解释以下奇怪之处.我正在使用Java 8更新11.

鉴于这种方法

private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
   return fun.apply(opt) ;
}
Run Code Online (Sandbox Code Playgroud)

如果我首先构造一个函数Object,并将其传递给上面的方法,那么事情就会编译.

private void doesCompile() {
    Function<Optional<String>, String> fun = o -> o.orElseThrow(() -> new RuntimeException("nah"));
    runFun(fun, Optional.of("foo"));

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将函数内联为lambda,编译器会说

未报告的例外X; 必须被抓住或宣布被抛出

private void doesNotCompile () {
    runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
}
Run Code Online (Sandbox Code Playgroud)

更新:原来错误消息由maven缩写.如果直接用javac编译,则错误是:

error: unreported exception X; must be caught or declared to be thrown
            runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
                                     ^
  where X,T are type-variables:
    X extends Throwable declared …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

66
推荐指数
2
解决办法
2万
查看次数

Java 8:计算lambda迭代的首选方法?

我经常遇到同样的问题.我需要计算一个lambda的运行,以便在lambda之外使用.例如:

myStream.stream().filter(...).forEach(item->{ ... ; runCount++);
System.out.println("The lambda ran "+runCount+"times");
Run Code Online (Sandbox Code Playgroud)

问题是runCount需要是final,所以它不能是int.它不能是一个整数,因为那是不可变的.我可以使它成为类级变量(即一个字段),但我只需要在这个代码块中.我知道有各种各样的方式,我只是好奇你最喜欢的解决方案是什么?您使用AtomicInteger或数组引用还是其他方式?

java lambda java-8 java-stream

66
推荐指数
7
解决办法
6万
查看次数

C#中lambda变量的范围是什么?

我对lambda变量的范围感到困惑,例如以下内容

var query = 
    from customer in clist
    from order in olist
    .Where(o => o.CustomerID == customer.CustomerID && o.OrderDate ==  // line 1
        olist.Where(o1 => o1.CustomerID == customer.CustomerID)        // line 2
             .Max(o1 => o1.OrderDate)                                  // line 3
    )
    select new {
        customer.CustomerID,
        customer.Name,
        customer.Address,
        order.Product,
        order.OrderDate
    };
Run Code Online (Sandbox Code Playgroud)

在第1行中,我声明了一个lambda变量'o',这意味着我不能在第2行再次声明它(或者至少编译器在我尝试时会抱怨)但是即使'o1'已经存在,它也不会抱怨第3行??

lambda变量的范围是什么?

c# lambda scope

65
推荐指数
3
解决办法
2992
查看次数