将代码转换为Lambda函数

将代码转换为Lambda函数,lambda,java-8,Lambda,Java 8,您好,我有以下代码,它从HttpURLConnection对象获取cookie for (int i=1; (headerName = connection.getHeaderFieldKey(i))!=null; i++){ if (headerName.equals("Set-Cookie")){ String cookie = connection.getHeaderField(i);

您好,我有以下代码,它从
HttpURLConnection
对象获取cookie

           for (int i=1; (headerName = connection.getHeaderFieldKey(i))!=null; i++){
                if (headerName.equals("Set-Cookie")){
                    String cookie = connection.getHeaderField(i);
                    cookie = cookie.substring(0, cookie.indexOf(";"));
                    String cookieName = cookie.substring(0, cookie.indexOf("="));
                    String cookieNameFromConfig = TalismaConnector.config.getValue("api.authentication.cookiename");
                    if (cookieName.equals(cookieNameFromConfig)){
                        //the right cookie to get the content from.
                        jsessionID = cookie.substring(cookie.indexOf("=") + 1, cookie.length());
                        OptJsessionID = Optional.ofNullable(jsessionID);
                        break;
                    }
                }
            }
我喜欢使用Java8编写一个健壮的lambda函数


有什么想法吗?

棘手的部分是在
null
条件下停止,因为
流不支持在任意
谓词上停止。处理此问题的唯一方法是让匹配的项和
null
都向下传递
,并使用
findFirst
查找匹配项或第一个
null

由于我们不希望在所有中间步骤中处理
null
,因此我们将这些步骤应用于封装匹配项的
Optional
,而不是
流本身,因为
Optional
如果为空,则不会起任何作用

String cookieNameFromConfig = TalismaConnector.config.getValue(
                                                     "api.authentication.cookiename");
IntStream.iterate(1, i -> i+1)
.filter(i -> { String k=connection.getHeaderFieldKey(i);
               return k==null || k.equals("Set-Cookie"); })
.mapToObj(i -> Optional.ofNullable(connection.getHeaderField(i))
  .map(cookie   ->cookie.substring(0, cookie.indexOf(";")))
  .filter(cookie->cookie.regionMatches(0,cookieNameFromConfig,0,cookie.indexOf("="))))
.findFirst().get().ifPresent(cookie -> {
        //the right cookie to get the content from.
        jsessionID = cookie.substring(cookie.indexOf("=") + 1, cookie.length());
        OptJsessionID = Optional.of(jsessionID);
});

@Vinay Joseph:这就是我在第二句中解释的,谓词接受两者,一个
null
头字段或
“Set Cookie”
,这样
findFirst
将找到匹配项或
null
,以先到者为准。由于流只有在处理了所有现有的头字段后才会遇到
null
值,因此遇到
null
意味着不存在匹配项。如果遇到
null
,即未找到匹配项,
findFirst().get()
将计算为空的
可选
,它的
ifPresent
方法将不起任何作用。我只是不熟悉return True的语法False@Vinay约瑟夫:哦,好吧,这超出了lambda表达式问题的范围。但没关系;关于
|
“逻辑or”的重要一点是,如果第一个表达式的值为
true
,则它不会对第二个表达式求值,因此如果
k
null
,Java将不会尝试对其调用
equals
。我非常感谢您的时间。非常感谢。