我有以下代碼
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 運算式?
uj5u.com熱心網友回復:
您的給定方法有幾個問題:
- 正如其他人已經提到的,lambda 運算式的重點是它應該簡短易懂。
- 要獲得多個邏輯運算式的邏輯和,您應該鏈接
filter(f -> ...)呼叫。這比將所有邏輯放入一個巨大的 lambda 運算式要好。 - 你要明白之間的差別
==和equals。所以,而不是keywords == ""你可能想要keywords.equals(""). - 你不能使用
ArrayList<String>因為.collect(Colllectors.toList())被宣告給一個List<String>.
考慮到這一切,你最終可能會得到這樣的結果
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;
}
uj5u.com熱心網友回復:
我相信以下應該達到你想要的結果。
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());
}
stream類中的方法java.util.Arrays將陣列轉換為流。在上面的代碼中,該流將包含 class 的實體java.io.File。map介面中的方法java.util.stream.Stream回傳一個新的流,在上面的代碼中,它包含String元素。- 最后,通過所有過濾器的所有路徑都被收集到一個
java.util.List.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/325820.html
上一篇:輸出==>elifmid_number<query:TypeError:'list'和'int'的實體之間不支持'<'
下一篇:IF陳述句邏輯
