相关疑难解决方法(0)

Java 8供应商和消费者对外行的解释

作为一名学习Java的非Java程序员,我正在阅读SupplierConsumer接口.我无法围绕他们的用法和意义.您何时以及为何使用这些界面?有人可以给我一个简单的非专业人士的例子......我发现Doc的例子不够简洁,我的理解.

java java-8

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

为什么我需要一个功能界面来处理lambdas?

我认为这个问题已经存在,但我无法找到它.

我不明白,为什么有必要使用功能界面来处理lambdas.请考虑以下示例:

public class Test {

    public static void main(String...args) {
        TestInterface i = () -> System.out.println("Hans");
//      i = (String a) -> System.out.println(a);

        i.hans();
//      i.hans("Hello");
    }
}

public interface TestInterface {
    public void hans();
//  public void hans(String a);
}
Run Code Online (Sandbox Code Playgroud)

这没有问题,但如果您取消注释注释行,它不会.为什么?在我的理解中,编译器应该能够区分这两种方法,因为它们具有不同的输入参数.为什么我需要一个功能界面并炸毁我的代码?

编辑:链接重复项没有回答我的问题,因为我问的是不同的方法参数.但是我在这里得到了一些非常有用的答案,感谢所有帮助过的人!:)

编辑2:对不起,我显然不是母语人士,但为了准确自己:

public interface TestInterface {
    public void hans();                 //has no input parameters</br>
    public void hans(String a);         //has 1 input parameter, type String</br>
    public void hans(String a, int b);  //has 2 input parameters, 1. type = String, …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 functional-interface

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

为什么在 Java 8 中使用 @FunctionalInterface 注解

如果我们的接口中只有一个抽象方法,那么默认情况下它是函数式接口。任何人都可以解释@FunctionalInterface 注释带来的额外优势吗?

我知道如果我们添加@FunctionalAnnotation,它不会允许有人在接口中添加另一个抽象方法,因为它会给出编译错误,但我的意思是即使你不使用@FucntionalInterface注解,那么还有,如果有人会添加另一个抽象方法,它会破坏代码中所有现有的 lambda 表达式,编译器会抱怨。

例如:

如果我有以下界面:

public interface User {

    Integer fetchData(Integer userId);
}
Run Code Online (Sandbox Code Playgroud)

具有以下实现:

public class UserImpl implements User{

    @Override
    public Integer fetchData(Integer userId) {
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

和以下用法:

公共类 TestFunctionalInterface {

public static void main(String[] args) {
    User user = a -> a*2;
    System.out.println("FetchedData:"+user.fetchData(2));
}
Run Code Online (Sandbox Code Playgroud)

}

现在,如果我尝试在界面中添加另一个方法,如下所示:

public interface User {

    Integer fetchData(Integer userId);

    Integer fetchLoginDetails(Integer userId);

}
Run Code Online (Sandbox Code Playgroud)

编译器在下面的代码中抱怨:

public class TestFunctionalInterface {

    public static void main(String[] args) {
        User user = a -> a*2;
        System.out.println("FetchedData:"+user.fetchData(2)); …
Run Code Online (Sandbox Code Playgroud)

java-8 functional-interface

9
推荐指数
3
解决办法
5227
查看次数

为什么lambda表达式可以用作比较器?

在" OCP学习指南 "一书中,有一个关于可以用两种方式初始化的比较器的示例.第一个是通过这样的匿名类:

Comparator<Duck> byWeight = new Comparator<Duck>(){
    public int compare(Duck d1, Duck d2){
        return d1.getWeight() - d2.getWeight();
    }
};
Run Code Online (Sandbox Code Playgroud)

这个我能理解.根据这本书,这可以用这样的lambda表达式替换:

Comparator<Duck> byWeight = (d1,d2) -> d1.getWeight() - d2.getWeight();
Run Code Online (Sandbox Code Playgroud)

现在这个我不明白.lambda表达式不返回Comparator对象,由于Comparator是一个接口,因此我现在无法想到它.

那么new第一个例子中的运算符是否引用了正在创建的匿名类,它被称为Comparator,因为匿名类实现了Comparator接口?

那么在例2中到底发生了什么?是否以lambda表达式创建了某个对象?在这个例子中,你byWeight用作参考变量吧?

我真的不明白这一点,有人可以解释一下吗?谢谢.

java lambda anonymous-inner-class comparator java-8

8
推荐指数
1
解决办法
2208
查看次数

Java8中功能接口的用途

关于Java8 内置功能接口,我遇到过很多问题,包括this,this,thisthis.但所有人都在问"为什么只有一种方法?" 或"如果我使用我的功能界面执行X,为什么会出现编译错误"等等.我的问题是:当我在自己的界面中使用lambda时,这些新功能接口的存在目的什么

请考虑以下来自oracle文档的示例代码:

    // Approach 6: print using a predicate
     public static void printPersonsWithPredicate(List<Person> roster, 
                                                  Predicate<Person> tester) {
            for (Person p : roster) {
                if (tester.test(p)) {
                   System.out.println(p);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

好的,很好,但这可以用上面的自己的例子来实现(一个单一方法的接口并不新鲜):

      // Approach 5: 
        public static void printPersons(<Person> roster, 
                                        CheckPerson tester) {
            for (Person p : roster) {
                if (tester.test(p)) {
                   System.out.println(p);
                }
            }
        }


  interface CheckPerson {
        boolean test(Person p);
    }
Run Code Online (Sandbox Code Playgroud)

我可以将lambda传递给两个方法. …

java java-8 functional-interface

5
推荐指数
2
解决办法
715
查看次数

您如何重写在 Java 8 中使用泛型和函数并仅使用面向对象的混合 oop 和函数式编程的代码?

我遇到过这种设计,但我没有完全掌握在 Java 8 中混合面向对象编程和函数式编程。

我对混合两种语言范式很感兴趣,而且互联网上的大多数教程都很简单,所以我无法通过混合来找到有关大规模软件设计的示例。所以有了这个示例案例,我想我有机会挖掘它的某些案例。

在这种情况下,让我展示代码的相关部分。这段代码包含一个通用的 FetchUtils 类,它实现了一个自定义迭代器,但为了简洁起见,我删除了一些部分。

public class FetchUtils<R, MSGIN, MSGOUT> {
    public SomeClass<R> getSomething(MSGIN query,
                                Function<MSGIN, MSGOUT> queryFunc,
                                Function<MSGOUT, List<R>> getResultList) {

               //...
                        MSGOUT callResult = queryFunc.apply(query);
                        buffer = getResultList.apply(callResult);
               //...
               //return someThing;
            }
            //...    
}
Run Code Online (Sandbox Code Playgroud)

在客户端中定义了一个函数和一个指向getCustomer类方法引用的 lambda 表达式。从客户端到使用泛型类型的上述方法的实际调用正在发送这些功能。

public class CustomerResponse {
   //...
   public List<Customer> getCustomer() {
        if (thing == null) {
            thing = new ArrayList<Customer>();
        }
        return this.customers;
    }
   //...
}

public class MyClient {

   //...

   @Autowired
   private FetchUtils<Customer, CustomerRequest, CustomerResponse> fetchUtils;

   //... …
Run Code Online (Sandbox Code Playgroud)

java generics functional-programming software-design java-8

5
推荐指数
1
解决办法
320
查看次数

Java 8 Lambda表达式 - 方法重载疑问

我正在尝试学习Lambda表达式,

interface MathOperartor 我已经确定使用Lambda表达式可以做到的操作()重载了,我确实可以使用Lambda表达式,但似乎无法弄清楚这里的问题是什么:

public static void main(String[] args) {
    LambdaLearning lb = new LambdaLearning();

    MathOperartor add = (a , b )->  a + b;  // error: The target type of this expression must be a functional interface
    MathOperartor sub = (a , b) -> a - b;   // same error
    MathOperartor mul = (a , b) -> a * b;   //  ''
    MathOperartor div = (a , b) -> a / b;   //  ''

    System.out.println(lb.operate(10, 15, add));
    System.out.println(lb.operate(10.5f, 15.5f, …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

2
推荐指数
1
解决办法
540
查看次数

为什么 lambda 表达式是 Java 中的对象?

Java 中的 lambda 表达式对象如何?作为函数式编程一部分的lambda表达式如何在Java这种面向对象的语言中实现呢?要理解 lambda 表达式,我需要哪些 Java 概念?

java lambda

2
推荐指数
1
解决办法
470
查看次数

访问Java 8 Lambda表达式中的字段

我写了一个线性搜索实现.我也使用Java 7和8编写了代码.

以下是我的代码:

int[] arr = new int[] { 12, 34, 94, 8, 37, 10 };
System.out.println("Enter the element to search: ");
Scanner scan = new Scanner(System.in);
int element = scan.nextInt();
boolean found = false;

// Linear search implementation using Java 7 features
for (int i = 0; i < arr.length; i++) {
    if (element == arr[i]) {
        int n = element;
        System.out.println("Element : "+n+" has been found at the index : "+i);
        found = true;
        break;
    }
}

// …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

1
推荐指数
1
解决办法
190
查看次数

Java lambda 如何自动匹配接口的函数?

我正在测试java的lambda是否与接口函数匹配,我在下面编写了代码,它可以工作。我有界面MyHandler,及其myFunction。在构造时,Java lambda 被转换为我的接口的实现者。

package mygroup;
interface MyHandler{
    void myFunction(int i);
}
class Worker{
    private final MyHandler handler;
    public Worker(MyHandler h){
        handler = h;
    }
    public void work(int i){handler.myFunction(i);};
}
public class TestLambda {
    public static void main(String[] args) {
        Worker worker = new Worker(i -> System.out.println(i));
        worker.work(3);
    }
}
Run Code Online (Sandbox Code Playgroud)

程序将打印3. 到目前为止一切顺利,但如果我添加一些其他函数声明,MyHandler如下所示:

interface MyHandler{
    void myFunction(int i);
    void f(int i, int j);
}
Run Code Online (Sandbox Code Playgroud)

Thread 构造函数中的 lambda 将无法编译,表示

The constructor Worker((<no type> i) -> …
Run Code Online (Sandbox Code Playgroud)

java lambda types interface function

0
推荐指数
1
解决办法
212
查看次数

函数式接口与具有单一方法(如 Runnable)的接口

在浏览功能接口时,我无法理解它们与使用单一方法的其他接口有何不同,例如 Runnable。

我们可以在尝试使用其他 Functional 接口时使用 Runnable。在 Java 8 之前,我们已经可以为单个功能创建接口和匿名对象。

例如:

@FunctionalInterface
public interface ITrade {
  public boolean check(Trade t);
}
Run Code Online (Sandbox Code Playgroud)

这与以下有何不同:

public interface ITrade {
  public boolean check(Trade t);
}
Run Code Online (Sandbox Code Playgroud)

java java-8 functional-interface

-1
推荐指数
1
解决办法
1410
查看次数