我在Java 8映射操作中传递了一个Function,Intellij告诉我可以将其替换为lambda表达式。但是我不知道如何在不创建中间对象结构的情况下做到这一点。
这是我的工作:
List<DocumentResult> documentResults = objects.getObject().stream() .map(new Function<ObjectType, DocumentResult>() { @Override public DocumentResult apply(ObjectType objectType) { String[] keys = objectType.getStorageKey().getObjectName().split("/"); DocumentResult result = new DocumentResult(DocCategories.valueByLabel(keys[1]), DocCategoryGroups.valueByLabel(keys[2]), DocSubCategories.valueByLabel(keys[3]), keys[4], keys[5]); result.setLink(objectType.getTempUrl().getFullUrl()); return result; } }) .collect(Collectors.toList());
我认为Intellij建议我这样做:
List<DocumentResult> documentResults = objects.getObject().stream() .map(object -> object.getStorageKey().getObjectName().split("/")) .map(tab -> new DocumentResult(DocCategories.valueByLabel(tab[1]), DocCategoryGroups.valueByLabel(tab[2]), DocSubCategories.valueByLabel(tab[3]), tab[4], tab[5])) .collect(Collectors.toList());
我不知道一种干净的方法来获取在匿名函数中检索到的objectType.getTempUrl()。getFullUrl()部分,有什么建议吗?
你总是可以写
List<DocumentResult> documentResults = objects.getObject().stream() .map(objectType -> { String[] keys = objectType.getStorageKey().getObjectName().split("/"); DocumentResult result = new DocumentResult(DocCategories.valueByLabel(keys[1]), DocCategoryGroups.valueByLabel(keys[2]), DocSubCategories.valueByLabel(keys[3]), keys[4], keys[5]); result.setLink(objectType.getTempUrl().getFullUrl()); return result; }) .collect(Collectors.toList());
…仅使用普通的多行lambda。