首页 > 解决方案 > 这段 JS 代码的正确 Java 等价物是什么?

问题描述

在某处看到用 JS 中的 1 行编写的相同代码后,我试图减少使用 Java 中的 Lambda 表达式的代码行。但我收到以下错误:

不兼容的类型。必需:org.openqa.selenium.logging.LogEntries 找到:无效

这就是我现在所拥有的。

List e =driver.manage().logs().get(LogType.BROWSER).getAll();
String s="",t ="";
if (!e.isEmpty()){
                for (Object l : e)
                {
                    t=l.toString();
                    if(t.contains("SyntaxError")){
                        s = s + t+"<BR/>";
                    }
                    else if(t.contains("EvalError")){
                        s = s + t+"<BR/>";
                    }
                    else if(t.contains("ReferenceError")){
                        s = s + t+"<BR/>";
                    }
                    else if(t.contains("RangeError")){
                        s = s + t+"<BR/>";
                    }
                    else if(t.contains("TypeError")){
                        s = s + t+"<BR/>";
                    }
                    else if(t.contains("URIError")){
                        s = s + t+"<BR/>";
                    }
                }

这就是我想要达到的目标:

List<String > errorStrings = new ArrayList<>();
            errorStrings.add("SyntaxError");
            errorStrings.add("EvalError");
            errorStrings.add("ReferenceError");
            errorStrings.add("RangeError");
            errorStrings.add("TypeError");
            errorStrings.add("URIError");
            LogEntries l = driver.manage().logs().get(LogType.BROWSER).forEach(le -> errorStrings.stream().anyMatch(er -> le.getMessage().contains(er)));

按照这行代码写的是JS:

var jsErrors = Driver.Manage().Logs.GetLog(LogType.Browser).Where(x => errorStrings.Any(e => x.Message.Contains(e)));

请帮助我了解我做错了什么。

-TIA

标签: javascriptjava

解决方案


你的代码是

LogEntries l = driver.manage().logs().get(LogType.BROWSER)
    .forEach(le -> errorStrings.stream()
        .anyMatch(er -> le.getMessage().contains(er)));

你的错误信息是

Incompatible types. Required: org.openqa.selenium.logging.LogEntries Found: void

错误消息告诉您,您的赋值语句期望您返回 aLogEntries但它得到的是void. 它得到 avoid因为那是Stream.forEach方法的返回类型。该forEach方法用于消耗流的所有元素并且不返回任何内容。

我认为您要做的是过滤一组日志条目并将它们变成一个LogEntries对象,对吗?如果是这种情况,我怀疑你想要filter而不是forEach.

我不是硒专家,所以我不能建议你如何打开Stream<LogEntry> into aLogEntries`。我假设您可以使用 reduce 或 collect 操作,但最好将其作为一个单独的问题提出。


推荐阅读