Projemizde java 8'e geçiş yapıyoruz ve yeni özelliklerini test ediyoruz.
Projemde ben filtrelemek ve kullanarak bazı koleksiyonları dönüştürmek için Guava yüklemleri ve işlevleri kullanıyorum Collections2.transform
ve Collections2.filter
.
Bu geçişte örneğin guava kodunu java 8'e değiştirmem gerekiyor. Yani, yaptığım değişiklikler şu türden:
List<Integer> naturals = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10,11,12,13);
Function <Integer, Integer> duplicate = new Function<Integer, Integer>(){
@Override
public Integer apply(Integer n)
{
return n * 2;
}
};
Collection result = Collections2.transform(naturals, duplicate);
To ...
List<Integer> result2 = naturals.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
Guava kullanarak, her dönüştürme işleminde hata ayıklayabildiğim için kodda hata ayıklarken çok rahattım, ancak mesela benim endişem nasıl hata ayıklayacağımdır .map(n -> n*2)
.
Hata ayıklayıcıyı kullanarak aşağıdaki gibi bazı kodlar görebilirim:
@Hidden
@DontInline
/** Interpretively invoke this form on the given arguments. */
Object interpretWithArguments(Object... argumentValues) throws Throwable {
if (TRACE_INTERPRETER)
return interpretWithArgumentsTracing(argumentValues);
checkInvocationCounter();
assert(arityCheck(argumentValues));
Object[] values = Arrays.copyOf(argumentValues, names.length);
for (int i = argumentValues.length; i < values.length; i++) {
values[i] = interpretName(names[i], values);
}
return (result < 0) ? null : values[result];
}
Ama kodda hata ayıklamak Guava kadar doğru değil, aslında n * 2
dönüşümü bulamadım .
Bu dönüşümü görmenin bir yolu veya bu kodda hata ayıklamanın kolay bir yolu var mı?
DÜZENLEME: Farklı yorumlardan cevap ekledim ve cevapları gönderdim
Holger
Soruma cevap veren yorum sayesinde , lambda bloğuna sahip olma yaklaşımı, dönüşüm sürecini görmeme ve lambda gövdesi içinde olanları ayıklamama izin verdi:
.map(
n -> {
Integer nr = n * 2;
return nr;
}
)
Stuart Marks
Yöntem referanslarına sahip olma yaklaşımı sayesinde , dönüşüm sürecindeki hataları da ayıklamamı sağladı:
static int timesTwo(int n) {
Integer result = n * 2;
return result;
}
...
List<Integer> result2 = naturals.stream()
.map(Java8Test::timesTwo)
.collect(Collectors.toList());
...
Marlon Bernardes
Cevap sayesinde Eclipse'imin ne yapması gerektiğini göstermediğini ve peek () kullanımının sonuçların görüntülenmesine yardımcı olduğunu fark ettim.
result
değişkeninizi olarak bildirmenize gerek yokturInteger
. Basitint
eğer yanı yapmalıyımmap
ping birint
bir etmekint
...