Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在地图中放置方法?_Java_Dictionary_Functional Programming_First Class Functions - Fatal编程技术网

Java 如何在地图中放置方法?

Java 如何在地图中放置方法?,java,dictionary,functional-programming,first-class-functions,Java,Dictionary,Functional Programming,First Class Functions,我需要在字符串中找到括号(),{},[],并使用堆栈检查正确性,如果有错误,则打印错误位置。因此,我将它们拆分为char数组,然后逐个检查符号,如果它与我的映射匹配,则执行向堆栈中推/弹出的方法 我想是这样的: ParentStack s = new ParentStack(); Map<Character, Method> map = new HashMap<Character, Method>(); map.put('(', s.push('(')); map.put

我需要在字符串中找到括号
()
{}
[]
,并使用堆栈检查正确性,如果有错误,则打印错误位置。因此,我将它们拆分为char数组,然后逐个检查符号,如果它与我的映射匹配,则执行向堆栈中推/弹出的方法

我想是这样的:

ParentStack s = new ParentStack();
Map<Character, Method> map = new HashMap<Character, Method>();
map.put('(', s.push('('));
map.put(')', s.pop()); //then check if its opposite 
ParentStack s = new ParentStack();
Map<Character, Method> map = new HashMap<Character, Method>();
map.put('(', (Function) () -> s.push('('));
map.put(')', (Function) () -> s.pop());
ParentStack s=newparentstack();
Map Map=newhashmap();
地图("""(""""),;
map.put('),s.pop());//然后检查它的对立面

那么是这样的吗?还是我必须使用开关?

因为java不是函数式编程语言(函数是所谓的),所以不能通过引用传递函数。相反,你可以用一个名为
execute()的方法创建一个接口
。然后为您想要拥有的每个功能实现此接口,并将其放入映射中,在映射中您可以轻松调用它们并执行这些“功能”

(在java 8中)您的代码可以如下所示:

ParentStack s = new ParentStack();
Map<Character, Method> map = new HashMap<Character, Method>();
map.put('(', s.push('('));
map.put(')', s.pop()); //then check if its opposite 
ParentStack s = new ParentStack();
Map<Character, Method> map = new HashMap<Character, Method>();
map.put('(', (Function) () -> s.push('('));
map.put(')', (Function) () -> s.pop());
我不认为这很容易阅读,但这是一个偏好的问题

要执行
功能
请使用:

map.get('(').execute();

您正在调用该方法,而不是将其放入映射中。您可以做的是将
Runnable
接口的实例放入映射中。
Runnable
是任何没有参数列表和返回值的方法的Java默认接口。如果您需要参数或返回值,您可能需要一个look在包中的接口处。例如,
供应商
有一个返回值,
消费者
有一个参数

下面是一个使用Java 8 lambda表达式的示例:

ParentStack s = new ParentStack();
Map<Character, Runnable> map = new HashMap<Character, Runnable>();
map.put('(', () -> s.push('('));
map.put(')', () -> s.pop());

run()
方法由
Runnable
接口声明,并将调用您放入映射中的方法。不要被不同的名称混淆。

使用
BooleanSupplier
而不是
方法

    Stack<Character> s = new Stack<>();
    Map<Character, BooleanSupplier> map = new HashMap<>();
    map.put('(', () -> { s.push('('); return true; });
    map.put(')', () -> !s.isEmpty() && s.pop() == '(');

检查这篇博文的正确性。将其展开以打印错误位置。您的“示例”甚至没有将方法放入映射中。您正在输入push和pop的返回值
    Stack<Character> s = new Stack<>();
    Map<Character, BooleanSupplier> map = new HashMap<>();
    map.put('(', () -> { s.push('('); return true; });
    map.put(')', () -> !s.isEmpty() && s.pop() == '(');
    String str = "((ab)c)";
    int errorAt = -1;
    for (int i = 0; i < str.length(); ++i) {
        char c = str.charAt(i);
        if (map.containsKey(c))
            if (!map.get(c).getAsBoolean()) {
                errorAt = i;
                break;
            }
    }
    if (errorAt == -1 && s.isEmpty())
        System.out.println("OK!");
    else if (errorAt == -1)
        System.out.println("error at " + str.length());  // too few ')'
    else
        System.out.println("error at " + errorAt);  // too many ')'
    int errorAt = IntStream.range(0, str.length())
        .filter(i -> map.containsKey(str.charAt(i)))
        .reduce(-1, (p, i) -> p >= 0 || map.get(str.charAt(i)).getAsBoolean() ? p : i);