假设我有一个typealias像这样的Kotlin函数类型的Kotlin 1.1
typealias Consumer<T> = (T) -> Unit
Run Code Online (Sandbox Code Playgroud)
我可以从Java访问它
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
Function1<? super T, Unit> action = ...
Run Code Online (Sandbox Code Playgroud)
是否有可能Function1以其Kotlin类型名称(即Consumer)从Java 访问Kotlin 接口?
我想按字母顺序对值进行排序,忽略区分大小写并返回键列表.
/**
* This method will sort allCostPlanDetailsRows based on Value in <Key,Value> pair
*
* @param sortingOrder_ whether to sort the LinkedHashMap in Ascending order or Descending order
* @return List<String> returns List of costPlanDetailsRowId in sorted order
*/
private List<String> sortCostPlanDetailRows( SortingOrder sortingOrder_ )
{
return _allCostPlanDetailRows
.entrySet()
.stream()
.sorted( sortingOrder_ == SortingOrder.DESC ? Map.Entry.<String, String>comparingByValue(Comparator.nullsFirst(Comparator.naturalOrder())).reversed() : Map.Entry.comparingByValue(Comparator.nullsFirst(
Comparator.naturalOrder())) )
.map( Map.Entry::getKey )
.collect( Collectors.toList() );
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
注意:如果我可以改进上面的代码,欢迎提出建议.
注释掉Stream.concat时,createLazyStream按预期工作,仅在应用终端操作时初始化.
但是如果你取消注释Stream.concat行,那么你会看到即使没有实际使用也没有初始化两个流(没有应用终端操作)
这是java bug,对吧?什么是变通方法?
@Test
public void testConcat() {
Stream<Integer> stream = createLazyStream();
// Stream<Integer> result = Stream.concat(stream, createLazyStream());
}
private Stream<Integer> createLazyStream() {
return StreamSupport.stream(() -> {
System.out.println("initializing stream");
return IntStream.range(1,10).spliterator();
}, Spliterator.ORDERED, false);
}
Run Code Online (Sandbox Code Playgroud) 我想按 ZoneDateTime 字段以相反顺序对列表进行排序,将计数限制为 20
public class VisitViewDTO implements Serializable {
private ZonedDateTime visitDate;
private int count;
public ZonedDateTime getVisitDate() {
return visitDate;
}
}
Run Code Online (Sandbox Code Playgroud)
……
List<VisitViewDTO> visitViewDTOList;
visitViewDTOList.stream().sorted(Comparator.comparing(VisitViewDTO::getVisitDate).reversed()).limit(20).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但得到了NPE:
java.lang.NullPointerException: null
at java.time.chrono.ChronoZonedDateTime.compareTo(ChronoZonedDateTime.java:570)
at java.time.chrono.ChronoZonedDateTime.compareTo(ChronoZonedDateTime.java:121)
at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
at java.util.Collections$ReverseComparator2.compare(Collections.java:5178)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:356)
at java.util.TimSort.sort(TimSort.java:220)
at java.util.Arrays.sort(Arrays.java:1512)
Run Code Online (Sandbox Code Playgroud)