标签: method-reference

无法对非静态方法进行静态引用

我阅读了教程“参考特定类型的任意对象的实例方法”。这是链接https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

所以我编写了自己的代码,但无法删除错误。 Arrays.sort(arr, String::compareToIgnoreCase);是一个合法的声明,但 Consumer m2 =Myclass::doit;给出了一个错误。如何解决这个错误?对特定类型的任意对象的实例方法的引用的概念是否适用于像 String 这样的 java 内置类?

这是我的代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

interface Myinter {
 void doit(List<String> s);
}
public class Myclass implements Myinter {
    public static void main(String[] args) {
        List<String> obj = new ArrayList<String>();
        obj.add("raj");
        obj.add("gopal");
        obj.add("bhallamudi");
        String arr[] = new String[obj.size()];
        arr = obj.toArray(arr);
        Arrays.sort(arr, String::compareToIgnoreCase);
        for (String s : arr)
            System.out.println(s + " ");

          Consumer<List<String>> m2 =Myclass::doit;
          m2.accept(obj);
    }
    @Override
    public void doit(List<String> …
Run Code Online (Sandbox Code Playgroud)

java java-8 method-reference

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

如何将 Java 方法参考代码转换为 Kotlin

我在Java中有这个代码:

mViewModel.getSetupData().observe(this, this::updateTime);
Run Code Online (Sandbox Code Playgroud)

注册方法接受一个参数。将此代码转换为 Kotlin 时,以下内容不起作用:

mViewModel?.getSetupData()?.observe(this, ::updateTime)
Run Code Online (Sandbox Code Playgroud)

IDE (android studio) 抱怨

类型不匹配。要求:观察者。找到 KFunction1。

有什么线索吗?

java-8 kotlin android-studio method-reference android-livedata

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

为什么我不能在收集器中将 Function.identity 引用为方法引用

有人可以建议,为什么我不能在这里应用方法参考?

工作代码。

System.out.println(
                Arrays.stream(str.split(" "))
                        .collect(Collectors.groupingBy(Function.identity(),Collectors.counting())));  
Run Code Online (Sandbox Code Playgroud)

编译错误,无法解析方法

System.out.println(
            Arrays.stream(str.split(" "))
                    .collect(Collectors.groupingBy(Function::identity,Collectors::counting)));
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream method-reference collectors

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

如何在java 8的forEach中使用方法引用测试Predicate

我正在尝试 forEach 内部的方法引用

private static void printConditionally8(List<Person> people, Predicate<Person> predicate) {
    people.forEach(p-> { if (predicate.test(p)){
        System.out.println("Print here");}
    });
}
Run Code Online (Sandbox Code Playgroud)

以上工作正常,但我想使用方法参考使它更短,但是它给出了编译问题。有什么办法让它发生?

private static void printConditionally8(List<Person> people, Predicate<Person> predicate) {
    people.forEach({ if (predicate::test){
        System.out.println("Print here");}
     });
}
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 method-reference

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

使用 Java 8 中的方法引用获取 Collectors toMap 方法中的流对象

我正在尝试使用stream()并放入地图来迭代列表,其中键是 steam 元素本身,值是 AtomicBoolean,true。

List<String> streamDetails = Arrays.asList("One","Two");
toReplay = streamDetails.stream().collect(Collectors.toMap(x -> x.toString(), new AtomicBoolean(true)));
Run Code Online (Sandbox Code Playgroud)

我在编译时收到以下错误。

Type mismatch: cannot convert from String to K
The method toMap(Function<? super T,? extends K>, Function<? super T,? extends U>) in the type Collectors is not applicable for the arguments ((<no type> x) -> {}, 
     AtomicBoolean)
Run Code Online (Sandbox Code Playgroud)

我可能做错了什么,我应该用什么x -> x.toString()来代替?

java collections java-8 java-stream method-reference

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

Java 泛型:特定参数类型的静态方法与功能接口不匹配

下面的第一个作业无法编译,但我不确定为什么,静态方法的方法签名与函数方法签名匹配,尽管它不使用类型参数。尽管第二行除了类型参数化之外具有相同的签名,但编译良好。

这背后的原因是什么?

public class GenericSample<T> {
    public static void staticLambdaMtd(Integer a) {
            
    }   

    public static<X> void staticLambdaMtd2(X a) {
            
    }  

    // Funca<T> fa1 = GenericSample::staticLambdaMtd;//does not compile !

    Funca<T> fa = GenericSample::staticLambdaMtd2;//does compile !      
}
    
interface Funca<A> {
    public void funct(A a);
}
Run Code Online (Sandbox Code Playgroud)

java generics covariance java-8 method-reference

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

无法弄清楚行为:使用lambda的方法引用

考虑下面的代码,

class DemoStatic {
    public static Runnable testStatic() {
        return () -> {
            System.out.println("Run");
        };
    }

    public void runTest () {
        Runnable r = DemoStatic::testStatic;
        r.run();
    }
}

public class MethodReferenceDemo {
    public static void main(String[] args) {
        DemoStatic demo = new DemoStatic();
        demo.runTest();
    }
}
Run Code Online (Sandbox Code Playgroud)

run()应该调用Runnable正由testStatic方法返回的实例的方法.控制台上的输出应为"运行".

但是这段代码没有调用run()实例的方法,r也没有任何东西在控制台中打印出来.

有人可以解释原因.

如果我没有正确使用方法参考"::",请评论.

java lambda java-8 method-reference

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

使用Java 8执行计时方法

我已经阅读了如何计算方法在Java中的执行时间?并了解定时执行方法的常用可能性(启动/停止计时器执行,使用方面等).

我想知道Java 8的新方法引用和lambdas是否为实现以下目标带来了任何帮助.

普通代码:

String r;
r = methodCall("foo","bar");
Run Code Online (Sandbox Code Playgroud)

在性能调优期间,将代码修改为类似的内容,以测量执行方法所花费的时间

String r;
time(() -> {
  r = methodCall("foo", "bar"); // doesn't work as r needs to be effectively final
});
Run Code Online (Sandbox Code Playgroud)

我明白我能做到

String r;
r = time1(() -> 
    methodCall("foo", "bar)
);
Run Code Online (Sandbox Code Playgroud)

(注意结尾处缺少的分号),使用类似的time1方法

public static <R> R time1(Supplier<R> s){
    long start = System.currentTimeMillis();
    R result  = s.get();
    System.out.println("Execution took " + (System.currentTimeMillis() - start));
    return result;
}
Run Code Online (Sandbox Code Playgroud)

或者我能做到

r = time2(this::methodCall, "foo", "bar");
Run Code Online (Sandbox Code Playgroud)

用time2方法就好

public static <A,B,R> R time2(BiFunction<A, B, …
Run Code Online (Sandbox Code Playgroud)

java closures java-8 method-reference

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

如何在JAVA中传递静态方法引用?

我有一个叫做的类Numbers,并且在一些static表示基本操作的方法中,例如加法,减法,乘法,除法.

现在我想创建一个静态方法operate,该方法接收对前面static解释过的方法的引用.我怎样才能做到这一点?

public class Numbers {
    public static long addition(long x, long y) {
         return x + y;
    }

    public static long operate(/*a reference to a static method in Numbers class*/,
                               long x, long y) {
         return reference(x, y);
    }
}
Run Code Online (Sandbox Code Playgroud)

java lambda functional-programming java-8 method-reference

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

使用流在HashMap中收集事件

我有一个练习要解决.我有一个Fox类,它有名字和颜色字段.我的练习是按颜色找出狐狸的频率.

因此我创建了一个HashMap,其中String属性将是狐狸名称,而Integer将是它本身的出现:

    Map<String, Integer> freq = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

完成后,我一直在尝试用流编写代码,但我正在努力做到这一点.我写了这样的东西:

    foxes.stream()
    .map(Fox::getColor)
    .forEach()
    //...(continued later on);
Run Code Online (Sandbox Code Playgroud)

,其中狐狸是一个清单.

我的问题基本上是语法.如果颜色没有出现,我想做一些事情

    freq.put(Fox::getName, 1)
Run Code Online (Sandbox Code Playgroud)

其他

    freq.replace(Fox::getName, freq.get(Fox::getName) + 1)
Run Code Online (Sandbox Code Playgroud)

我该怎么把它放在一起?

java hashmap java-8 java-stream method-reference

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