此问题已经在这里有了答案:
是的,已经有这样的问题了,但是我是一个Java新手,但似乎没有一个可以解决我的具体情况。
这是我当前的代码:
Something.java
public class Something {
public Something() {
}
public void someMethod(Runnable runnable) {
String e = "This string is currently unused";
runnable.run();
}
}
BasicallyAnythingElse.java
Something something = new Something();
something.someMethod(() -> {
System.out.println("Test");
});
此代码目前仍在运行,但是我希望能够在BasicnAnythingElse.java中定义的Runnable中的Something.java中使用未使用的String,如下所示:
something.someMethod((e) -> {
System.out.println(e);
});
然而,仅将runnable.run
之后的e放在“()”中并不起作用。回答时,请记住我是Java新手,是的,我知道对于像我这样的人编写这样的复杂代码并不是很明智,但是我确实需要此代码。
了解functional interfaces。您需要一个Consumer。像这样:
public class Something {
public Something() {
}
public void someMethod(Consumer<String> consumer) {
String e = "Test";
consumer.accept(e);
}
}
这样称呼:
Something something = new Something();
something.someMethod(System.out::println);
打印:
Test
编辑:如果您确实真的想要一个可运行对象,则可以使用参数捕获,如下所示:
public class Something {
public Something() {
}
public void someMethod(Runnable runnable) {
runnable.run();
}
}
这样称呼:
String test = "test string";
Something something = new Something();
something.someMethod(() -> System.out.println(test));
打印:
test string
但是,在这一点上,它是如此冗余,您不妨只执行以下操作:
String test = "blah blah blah";
Runnable r = () -> {
doWhateverYouWantToInputPartOne(test);
doWhateverYouWantToInputPartTwo(test);
};
... whenever you want to run it later
r.run();