作者:贴进你的心聆听你的世界 | 来源:互联网 | 2023-01-22 13:10
Iwasthinkingabitandcameupwithaninterestingproblem,supposewehaveaconfiguration(input
I was thinking a bit and came up with an interesting problem, suppose we have a configuration (input) file with:
我想了一下,想出了一个有趣的问题,假设我们有一个配置(输入)文件:
x -> x + 1
x -> x * 2
x -> x * x
x -> -x
And furthermore we have a list of Integer
s:
此外,我们有一个整数列表:
List list = new ArrayList<>();
list.addAll(Arrays.toList(1, 2, 3, 4, 5));
Is there a way to convert the String
s (x -> x + 1
, etc.) to Object
s that represent a lambda expression? Which could then be used as:
有没有办法将字符串(x - > x + 1等)转换为表示lambda表达式的对象?然后可以用作:
Object lambda = getLambdaFromString("x -> x + 1");
if (lambda.getClass().equals(IntFunction.class) {
list.stream().forEach()
.mapToInt(x -> x)
.map(x -> ((IntFunction)lambda).applyAsInt(x))
.forEach(System.out::println);
}
How would I write such a method getLambdaFromString
?
我怎么写这样的方法getLambdaFromString?
2 个解决方案
24
Marko's comment on the question is correct. You can't read a bare Java lambda expression out of a file, since such an expression isn't defined without a target type provided by the context. For example, consider the following method declarations:
Marko对这个问题的评论是正确的。您无法从文件中读取裸Java lambda表达式,因为如果没有上下文提供的目标类型,则不会定义此类表达式。例如,请考虑以下方法声明:
void method1(BiFunction f) { ... }
void method2(BiFunction f) { ... }
Then in the following code,
然后在下面的代码中,
method1((x, y) -> x + y);
method2((x, y) -> x + y);
the two lambda expressions (x, y) -> x + y
mean completely different things. For method1, the +
operator is string concatenation, but for method2, it means integer addition.
两个lambda表达式(x,y) - > x + y表示完全不同的东西。对于method1,+运算符是字符串连接,但对于method2,它表示整数加法。
This is wandering a bit far afield from your question, but you can read and evaluate a lambda or function expression using a dynamic language. In Java 8 there is the Nashorn Javascript engine. So instead of attempting to read an evaluate a Java lambda expression, you could read and evaluate a Javascript function using Nashorn, called from Java.
这在你的问题上有点偏远,但你可以使用动态语言阅读和评估lambda或函数表达式。在Java 8中有Nashorn Javascript引擎。因此,您可以使用从Java调用的Nashorn来读取和评估Javascript函数,而不是尝试读取评估Java lambda表达式。
The following code takes a function in arg[0] and applies it to each subsequent, printing the results:
以下代码采用arg [0]中的函数并将其应用于每个后续函数,打印结果:
import java.util.function.Function;
import javax.script.*;
public class ScriptFunction {
public static void main(String[] args) throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
@SuppressWarnings("unchecked")
Function
Still, you might find this technique useful if you have a need to evaluate expressions or functions read from a file.
但是,如果您需要评估从文件中读取的表达式或函数,您可能会发现此技术很有用。