如果您願意使用第三方庫,您可以使用一些有趣的選項與Eclipse Collections。
如果使用ArrayList
因爲你擁有了它上面,你可以使用LazyIterate
工具如下:
int count = LazyIterate.collect(custNames, String::toLowerCase)
.countWith(String::startsWith, nameStarts.toLowerCase());
Assert.assertEquals(2, count);
如果您使用Eclipse集合替代ArrayList
,您可以直接利用現有的豐富的功能性協議在MutableList
:
MutableList<String> custNames =
Lists.mutable.with("John", "Tom", "Bart", "Tim", "Broad");
String nameStarts= "T";
int count = custNames.asLazy()
.collect(String::toLowerCase)
.countWith(String::startsWith, nameStarts.toLowerCase());
System.out.println(count);
Assert.assertEquals(2, count);
在Eclipse中集合的串行API急於按默認,這就是爲什麼我叫asLazy()
第一。收集方法否則會創建另一個MutableList
。
如果您基準您的全套數據的代碼,代碼的下面平行的版本可能會更好的性能:
MutableList<String> custNames =
Lists.mutable.with("John", "Tom", "Bart", "Tim", "Broad");
String nameStarts= "T";
int processors = Runtime.getRuntime().availableProcessors();
int batchSize = Math.max(1, custNames.size()/processors);
ExecutorService executor = Executors.newFixedThreadPool(processors);
int count = custNames.asParallel(executor, batchSize)
.collect(String::toLowerCase)
.countWith(String::startsWith, nameStarts.toLowerCase());
executor.shutdown();
Assert.assertEquals(2, count);
在Eclipse館藏asParallel()
API是懶惰的默認。 API迫使您傳遞一個ExecutorService
和一個int
batchSize。這使您可以完全控制並行性。
您還可以在Eclipse集合中使用Stream API和所有MutableCollections
,因爲它們擴展爲java.util.Collection
。
注意:我是Eclipse集合的提交者。
使用.stream()。parallel()獲得顯着的性能改進 – Kushan
對此非常小心。如果你的輸入不是很大,使用parallel()將會主動地損害性能並且使代碼變慢。 –
我認爲在調用.parallel()後缺少.map(String :: toLowerCase) –