将代码转换为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
。我非常感谢您的时间。非常感谢。