标签: functional-interface

java中功能接口实例的等价性

我不确定如何确定功能接口的相等/不变性.我想在java 8中使用这个语法糖时可能无法保证平等,如果你有任何提示,请告诉我任何提示.

我为我的问题制作了一个简短的代码片段.

public interface Element {
    void doSomething(int a);
}
Run Code Online (Sandbox Code Playgroud)

我试图以功能方式添加此接口的实例

public class FunctionSet {

    public void doubleUp(int a) {
        System.out.println(a*2);
    }

    public void square(int a) {
        System.out.println(a*a);
    }

    public static void main(String[] args) {
        HashSet<Element> set = new HashSet<>();
        FunctionSet functionSet = new FunctionSet();

        set.add(functionSet::doubleUp);
        set.add(functionSet::square);

        System.out.println(set.add(functionSet::doubleUp));
    }

}
Run Code Online (Sandbox Code Playgroud)

它打印为true,这意味着没有任何相等检查,并且我添加它后也无法从Set中删除任何实例.

如果我使用功能接口作为参数,有什么方法可以以某种方式比较这些实例?

将提供任何帮助,谢谢!

java equality immutability java-8 functional-interface

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

请使用类名解释Java 8方法参考实例方法

public interface MyFunc<T> {

    boolean func(T v1, T v2);

}
Run Code Online (Sandbox Code Playgroud)
public class HighTemp {

    private int hTemp;

    HighTemp(){

    }
    public HighTemp(int ht) {
        this.hTemp = ht;
    }

    boolean sameTemp(HighTemp ht2){
         return hTemp == ht2.hTemp;
    }

     boolean lessThanTemp(HighTemp ht2){
        return hTemp < ht2.hTemp;
    }
}
Run Code Online (Sandbox Code Playgroud)
class InstMethWithObjRef {

    static <T> int counter(T[] vals, MyFunc<T> f, T v){
        int count = 0;

        for (int i = 0; i < vals.length; i++) {
            if(f.func(vals[i], v)) count++;
        }
        return count;
    }
    public static void …
Run Code Online (Sandbox Code Playgroud)

java java-8 functional-interface method-reference

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

Function.class中下限通配符的目的是什么?

在Java8的Function.class中,我们有:

default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
    Objects.requireNonNull(before);
    return (V v) -> apply(before.apply(v));
}
Run Code Online (Sandbox Code Playgroud)

撰写接受:

Function<? super V, ? extends T> before
Run Code Online (Sandbox Code Playgroud)

而不是:

Function<V, ? extends T> before
Run Code Online (Sandbox Code Playgroud)

是否有任何合理的情况,其中"V"是有限的事实?

java java-8 functional-interface

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

Java11中的谓词过滤所有元素

我正在使用Java11.学习一种新的方法Predicate.not,我发现我目前的代码只找到猫科:

List<String> animals = List.of("cat", "leopard", "dog", "lion", "horse");
Predicate<String> cats = a -> !a.equals("dog") && !a.equals("horse");
Set<String> filterCat = animals.stream().filter(cats).collect(Collectors.toSet());
System.out.println(filterCat);
Run Code Online (Sandbox Code Playgroud)

输出是:

豹,猫,狮子

现在我正在尝试使用新方法,输出结果不正确.我该如何纠正?我做错了什么?

我后来的代码:

Predicate<String> updatedCatFilter = Predicate.not(a -> a.equals("dog") && a.equals("horse"));
Set<String> catFamily = animals.stream().filter(updatedCatFilter).collect(Collectors.toSet());
System.out.println(filterCat);
Run Code Online (Sandbox Code Playgroud)

但是现在输出我的所有列表.

马,豹,猫,狗,狮子

java predicate functional-interface java-11

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

如何在Java中实现与Enum相对应的BiFunctional函数?

我有Java enum:

public enum ConflictResolutionStrategy {
    softResolve,
    hardResolve,
}
Run Code Online (Sandbox Code Playgroud)

我想称之为ConflictResolutionStrategy.hardResolve.apply(case1, case2).

两者case1case2相同类型的对象.apply在我的情况下应该什么也不返回

这个设计背后的基本思想.Strategy根据设定enum值创建设计模式并解决冲突.

我在StackOveflow上找不到任何类似的问题,即使简单的搜索也给了我很多类似的案例,这些案例并没有直接解决我的问题.

我尝试了以下内容:

public enum ConflictResolutionStrategy {
    softResolve ((CaseType case1, CaseType case2) -> case1.update(case2)),
    hardResolve,
}
Run Code Online (Sandbox Code Playgroud)

上面的这个版本不编译.

我试过另一个解决方案

public enum ConflictResolutionStrategy {
    softResolve,
    hardResolve {
        public void apply(CaseType case1, CaseType case2) {
            case1.update(case2);
        }
    },
}
Run Code Online (Sandbox Code Playgroud)

第二种解决方案,运行正常但需要太多代码.

java lambda enums java-8 functional-interface

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

代码在Eclipse中编译,但不能在Javac中编译:带有功能子接口的咖喱lambda。哪个是正确的?

我在Eclipse中开发了一些代码,对其进行了成功的测试,将其推送到我们的Jenkins CI服务器上,并收到了一封电子邮件,指出Maven由于Java编译错误而感到窒息。随后,我隔离了该问题,并创建了以下显示该问题的最小示例:

import java.util.List;
import java.util.function.Function;

class MinimalTypeFailureExample {
    public static void main(String[] args) {
        List<String> originalList = null;  // irrelevant
        List<IntToByteFunction> resultList = transform(originalList,
                outer -> inner -> doStuff(inner, outer));
        System.out.println(resultList);
    }

    static <F, T> List<T> transform(List<F> originalList,
            MyFunction<? super F, ? extends T> function) {
        return null;  // irrelevant
    }

    static Byte doStuff(Integer inner, String outer) {
        return null;  // irrelevant
    }
}

@FunctionalInterface
interface MyFunction<F, T> extends Function<F, T> {
    @Override
    T apply(F input);
}

@FunctionalInterface
interface …
Run Code Online (Sandbox Code Playgroud)

java eclipse generics lambda functional-interface

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

在Java中寻找“返回价值的消费者”抽象

是否有针对消费者的内置或强大的第三方抽象在Java 8+中返回了价值?

PS对于延迟执行,它也可能返回Future

更新。 函数接口在语法上有完美的匹配,但是在语义方面存在一些考虑。在这种情况下使用Function显然会破坏不更改外部状态的合同。怎么处理呢?

java abstraction producer-consumer functional-interface

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

Stream.reduce(Float,BinaryOperator)BinaryOperator是指哪种功能接口方法?

例如,

List<Product> productsList = new ArrayList<Product>();  
productsList.add(new Product(1,"HP Laptop",25000f));  
productsList.add(new Product(2,"Dell Laptop",30000f));  
productsList.add(new Product(3,"Lenevo Laptop",28000f));  
productsList.add(new Product(4,"Sony Laptop",28000f));  
productsList.add(new Product(5,"Apple Laptop",90000f));  

Float totalPrice = productsList.stream()  
                               .map(product->product.price)  
                               .reduce(0.0f,(sum, price)->sum+price);   
System.out.println(totalPrice); 
Run Code Online (Sandbox Code Playgroud)

这是哪个功能界面,(sum, price)->sum+price是指?

java java-8 java-stream functional-interface

7
推荐指数
2
解决办法
92
查看次数

为什么在工厂方法和方法引用(单例/原型)中使用 lambda 时函数接口初始化不同?

我有两种生产“消费者”的工厂方法使用不同的方法 lambda 和方法引用:

@SuppressWarnings("Convert2MethodRef")
public Consumer<String> lambdaPrintStringConsumer(){
    return x -> System.out.println(x);
}

public Consumer<String> methodRefPrintStringConsumer(){
    return System.out::println;
}
Run Code Online (Sandbox Code Playgroud)

我发现在第一种情况 ( lambdaPrintStringConsumer()) 中,方法返回对同一对象的引用

@Test
public void shouldSameFromFactoryMethod_lambda() {
    Consumer<String> consumerA = lambdaPrintStringConsumer();
    Consumer<String> consumerB = lambdaPrintStringConsumer();
    
    Assert.assertSame(consumerA, consumerB);//consumerA == consumerB --> true
}
Run Code Online (Sandbox Code Playgroud)

但是在第二个 ( methodRefPrintStringConsumer()) 中,对象是不同的

@Test
public void shouldNotSameFromFactoryMethod_methodRef() {
    Consumer<String> consumerA = methodRefPrintStringConsumer();
    Consumer<String> consumerB = methodRefPrintStringConsumer();

    Assert.assertNotSame(consumerA, consumerB);//consumerA == consumerB --> false
}
Run Code Online (Sandbox Code Playgroud)

直接方法返回与以下相同的结果shouldNotSameFromFactoryMethod_methodRef()

@SuppressWarnings("Convert2MethodRef")
@Test
public void shouldNotSameFromLambda() {
    Consumer<String> …
Run Code Online (Sandbox Code Playgroud)

java lambda equals functional-interface method-reference

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

Kotlin 1.4 中的函数接口

此功能即将推出Kotlin 1.4。这是摘录自KotlinConf'19.

fun interface Action {
    fun run()
}

fun runAction(a: Action) = a.run()

runAction{
    println("Hello")
}
Run Code Online (Sandbox Code Playgroud)

看起来不错,但我仍然不知道它有什么作用。

什么是函数接口?它的实用价值是什么?它可以用于哪些具体场景?

kotlin functional-interface

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