我阅读了教程“参考特定类型的任意对象的实例方法”。这是链接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中有这个代码:
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
有人可以建议,为什么我不能在这里应用方法参考?
工作代码。
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) 我正在尝试 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) 我正在尝试使用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()来代替?
下面的第一个作业无法编译,但我不确定为什么,静态方法的方法签名与函数方法签名匹配,尽管它不使用类型参数。尽管第二行除了类型参数化之外具有相同的签名,但编译良好。
这背后的原因是什么?
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) 考虑下面的代码,
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中的执行时间?并了解定时执行方法的常用可能性(启动/停止计时器执行,使用方面等).
我想知道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) 我有一个叫做的类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) 我有一个练习要解决.我有一个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-8 ×10
method-reference ×10
java ×9
java-stream ×3
lambda ×3
closures ×1
collections ×1
collectors ×1
covariance ×1
generics ×1
hashmap ×1
kotlin ×1