获取多重逻辑的逻辑和表达式,应该将 您需要了解 您不能使用
我有以下代码
private ArrayList<String> findPhotos(Date startTimestamp, Date endTimestamp, String keywords, String longitude, String latitude) {
ArrayList<String> photos = new ArrayList<String>();
File[] fList = file.listFiles();
if (fList != null) {
for (File f : fList) {
if (((startTimestamp == null && endTimestamp == null) || (f.lastModified() >= startTimestamp.getTime()
&& f.lastModified() <= endTimestamp.getTime())
) && (keywords == "" || f.getPath().contains(keywords))
&& (longitude == "" || f.getPath().contains(longitude))
&& (latitude == "" || f.getPath().contains(latitude)))
photos.add(f.getPath());
}
}
return photos
}
此函数采用五个参数:
- 开始时间
- 结束时间
- 钥匙
- 经度
- 纬度
我过滤掉它们以获得唯一想要的结果。我想把这个文件数组转移到lambda数组中,然后执行以下代码。
Filter(startTimestamp == null && endTimestamp == null)
或
Filter(f -> f.lastModified() >= startTimestamp.getTime())
和
Filter(f -> f.getPath().contains(keywords) or (keywords == ""))
和
Filter(keywords == "" || f -> f.getPath().contains(keywords))
和
Filter(latitude== "" || f -> f.getPath().contains(latitude))
Filter(keywords == "" || f -> f.getPath().contains(keywords))
然后只获取路径,然后
.collect(Collectors.toList());
一旦我从File数组中筛选出它们,然后只将文件路径添加到Arraylist<String>
中。有人能帮我把这个变成lambda表达式吗?
我相信以下内容应该会达到您想要的结果。
private List<String> findPhotos(Date startTimestamp,
Date endTimestamp,
String keywords,
String longitude,
String latitude) {
return java.util.Arrays.stream(new file.listFiles())
.filter(f -> startTimestamp == null || f.lastModified() >= startTimestamp.getTime())
.filter(f -> endTimestamp == null || f.lastModified() <= endTimestamp.getTime())
.map(file -> file.getPath())
.filter(path -> keywords.isEmpty() || path.contains(keywords))
.filter(path -> longitude.isEmpty() || path.contains(longitude))
.filter(path -> latitude.isEmpty() || path.contains(latitude))
.collect(Collectors.toList());
}
- 类
java.util.Arrays
中的方法stream
将数组转换为流。在上面的代码中,该流将包含类java.io.File
的实例 - 方法
map
在接口java.util.stream.Stream
中返回一个新流,在上面的代码中,该新流包含String
元素 - 最后,通过所有滤波器的所有路径被收集到
java.util.List
中
给定的方法有几个问题:
正如其他人已经提到的,lambda的点表达方式是它应该简短且易于理解filter(f -> ...)
调用链接起来。这比把所有的逻辑都放在一个巨人身上要好lambda表达式==
和CCD_ 11。所以你可能不是keywords == ""
想要keywords.equals("")
ArrayList<String>
,因为.collect(Colllectors.toList())
被宣布给予CCD_ 16考虑到这一切,你可能会得到这样的
private List<String> findPhotos(Date startTimestamp, Date endTimestamp, String keywords, String longitude, String latitude) {
{
File[] fList = file.listFiles();
if (fList == null)
return new ArrayList<String>();
List<String> photos = Arrays.stream(fList)
.filter(f -> f.lastModified() >= startTimestamp.getTime())
.filter(f -> f.getPath().contains(keywords))
.filter(f -> keywords.equals("") || f.getPath().contains(keywords))
.filter(f -> latitude.equals("") || f.getPath().contains(latitude))
.filter(f -> keywords.equals("") || f.getPath().contains(keywords))
.map(f -> f.getPath()) // convert File to String
.collect(Collectors.toList());
return photos;
}