如何在流API Android Java的lamba表达式中使用File数组编写复杂if条件



我有以下代码

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
}

此函数采用五个参数:

  1. 开始时间
  2. 结束时间
  3. 钥匙
  4. 经度
  5. 纬度

我过滤掉它们以获得唯一想要的结果。我想把这个文件数组转移到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;
    }
    

    相关内容

    • 没有找到相关文章

    最新更新