Tag: java 8

使用stream将自定义比较器收集到TreeSet中

在Java 8中工作,我有一个像这样定义的TreeSet : private TreeSet<PositionReport> positionReports = new TreeSet<>(Comparator.comparingLong(PositionReport::getTimestamp)); PositionReport是一个相当简单的类,定义如下: public static final class PositionReport implements Cloneable { private final long timestamp; private final Position position; public static PositionReport create(long timestamp, Position position) { return new PositionReport(timestamp, position); } private PositionReport(long timestamp, Position position) { this.timestamp = timestamp; this.position = position; } public long getTimestamp() […]

Java 8 Stream:limit()和skip()之间的区别

谈论Stream ,当我执行这段代码的时候 public class Main { public static void main(String[] args) { Stream.of(1,2,3,4,5,6,7,8,9) .peek(x->System.out.print("\nA"+x)) .limit(3) .peek(x->System.out.print("B"+x)) .forEach(x->System.out.print("C"+x)); } } 我得到这个输出 A1B1C1 A2B2C2 A3B3C3 因为限制我的stream到前三个组件迫使行动A , B和C只能执行三次。 试图通过使用skip()方法对最后三个元素执行类似的计算,显示了不同的行为:this public class Main { public static void main(String[] args) { Stream.of(1,2,3,4,5,6,7,8,9) .peek(x->System.out.print("\nA"+x)) .skip(6) .peek(x->System.out.print("B"+x)) .forEach(x->System.out.print("C"+x)); } } 输出这个 A1 A2 A3 A4 A5 A6 A7B7C7 A8B8C8 A9B9C9 为什么在这种情况下,正在执行A1到A6的动作? […]

用Java 8制作的程序可以在Java 7上运行?

我有点困惑。 甲骨文表示,Java 8与Java 7高度兼容(落后)。 但是,Java 8程序可以在Java 7上成功运行(SE / EE)有什么可能? 如果第一点是真的,Java 8应用程序将被部署并在Java 7服务器支持上执行? 例如,Tomcat 8或WildFly?

取符合条件的第一个元素

如何获得匹配stream中的条件的第一个元素? 我试过这个,但不起作用 this.stops.stream().filter(Stop s-> s.getStation().getName().equals(name)); 该条件不起作用,filter方法在Stop以外的其他类中调用。 public class Train { private final String name; private final SortedSet<Stop> stops; public Train(String name) { this.name = name; this.stops = new TreeSet<Stop>(); } public void addStop(Stop stop) { this.stops.add(stop); } public Stop getFirstStation() { return this.getStops().first(); } public Stop getLastStation() { return this.getStops().last(); } public SortedSet<Stop> getStops() { […]

Java 8stream与批处理

我有一个包含项目列表的大文件。 我想创build一批物品,用这个批处理做一个HTTP请求(在HTTP请求中所有这些项都需要作为参数)。 我可以用for循环很容易地做到这一点,但是作为Java 8的爱好者,我想尝试用Java 8的Stream框架来编写这个代码(并获得延迟处理的好处)。 例: List<String> batch = new ArrayList<>(BATCH_SIZE); for (int i = 0; i < data.size(); i++) { batch.add(data.get(i)); if (batch.size() == BATCH_SIZE) process(batch); } if (batch.size() > 0) process(batch); 我想做一些lazyFileStream.group(500).map(processBatch).collect(toList()) 什么是最好的方法来做到这一点?

为什么SIZE常量只有@Native整数和长?

我了解@Native注释的@Native 。 表示定义一个常数值的字段可以从本地代码引用。 注释可以被用作生成本地头文件以确定是否需要头文件的工具的提示,并且如果是的话,它应该包含什么声明。 然而,在阅读java源代码时,我注意到在类Integer和Long , SIZE常量是@Native而不是Float,Byte,Double,Short和Character。 请注意,SIZE常量表示用于表示实际值的位数。 public static final int SIZE = 8;//Byte public static final int SIZE = 16;//Character public static final int SIZE = 16;//Short public static final int SIZE = 32;//Float @Native public static final int SIZE = 32;//Integer @Native public static final int SIZE = 64;//Long public static final […]

深入分析者的特点

为了试图深入理解javastream和分割器,我有一些关于分割器特性的细微问题: Q1: Stream.empty() vs Stream.of() (Stream.of()没有参数) Stream.empty() : 已经过时,已经大小 Stream.of() :已预订, 不可预约 ,已预订,已预订 为什么Stream.empty()没有Stream.empty()的相同特征? 请注意,它与Stream.concat()(特别是没有ORDERED )一起使用时会产生影响。 我会说, Stream.empty()应该不只是IMMUTABLE和ORDERED,但也DISTINCT和NONNULL 。 也有道理Stream.of()只有一个参数有DISTICT 。 Q2: LongStream.of()没有NONNULL 只注意到NONNULL在LongStream.of不可用。 是不是NONNULL是所有LongStream , IntStream和DoubleStream的主要特征? Q3: LongStream.range(,)与LongStream.range(,).boxed() LongRange.range(,) :已预订, 不可更改,不可空,已大小,已sorting,已sorting,已排除 LongStream.range(,).boxed() : 已订购,已订购,已订购 为什么.boxed()失去了所有这些特征? 它不应该失去任何。 我知道.mapToObj()可能会失去NONNULL,IMMUTABLE和DISTICT ,但.boxed() …没有任何意义。 Q4: .peek()失去IMMUTABLE和NONNULL LongStream.of(1) : SUBSIZED,IMMUTABLE,NONNULL,SIZED,… LongStream.of(1).peek() : SUBSIZED,SIZED,… 为什么.peek()失去了这些特征? .peek不应该真的失去任何。 Q5: .skip() .limit()失去了SUBSIZED,IMMUTABLE,NONNULL,SIZED 只要注意,这些操作失去了SUBSIZED,IMMUTABLE,NONNULL,SIZED 。 […]

如何检查Java 8stream是否为空?

如何检查Stream是否为空,如果不是,则作为非terminal操作抛出exception? 基本上,我正在寻找相当于下面的代码,但没有实现中间的stream。 特别是,在stream被terminal操作实际消耗之前,检查不应该发生。 public Stream<Thing> getFilteredThings() { Stream<Thing> stream = getThings().stream() .filter(Thing::isFoo) .filter(Thing::isBar); return nonEmptyStream(stream, () -> { throw new RuntimeException("No foo bar things available") }); } private static <T> Stream<T> nonEmptyStream(Stream<T> stream, Supplier<T> defaultValue) { List<T> list = stream.collect(Collectors.toList()); if (list.isEmpty()) list.add(defaultValue.get()); return list.stream(); }

是否有像可选的类,但非可选项?

声明函数来映射值并消耗它们(如果存在的话)是很方便的。 在这种情况下,你有几个强制性对象和几个选项,我发现自己也包装在Optional.of(mandatoryObject)中,所以我可以在它们上使用相同的expression式而不用全部写回。 Food vegetables = Food.someVegetables(); Optional<Food> condiment = Food.someCondiment(); Optional<Food> spices = Food.someSpices(); condiment.map(prepare).ifPresent(putOnPlate); spices.map(prepare).ifPresent(putOnPlate); 但是,我不喜欢这个代码: putOnPlate.accept(prepare.apply(vegetables)); 所以我把它包起来: Optional.of(vegetables).map(prepare).ifPresent(putOnPlate); 但这是错误的,因为蔬菜(在这个例子中)实际上并不是可选的。 他们是非常重要的,我给大家的印象是他们是可选的。 所以我的问题是:是否有像java.util.Mandatory java中的一些类,所以我可以写: Mandatory.of(vegetables).map(prepare).definitelyPresentSo(putOnPlate);

Java 8 Lambdas上的reflectiontypes推断

我正在尝试Java 8中的新Lambdas,并且正在寻找一种在lambda类上使用reflection来获取lambda函数的返回types的方法。 我特别感兴趣的是lambda实现通用超接口的情况。 在下面的代码示例中, MapFunction<F, T>是通用超接口,我正在寻找一种方法来查找绑定到通用参数T 。 虽然Java在编译器之后丢弃了大量的genericstypes信息,但generics超类和generics超接口的子类(和匿名子类)却保留了这种types的信息。 通过reflection,这些types是可访问的。 在下面的例子(例1)中 ,reflection告诉我, MyMapper实现将java.lang.Integer绑定到genericstypes参数T 即使对于本身是generics的子类,也有一些方法可以找出与generics参数绑定的是什么,如果其他的已知的话。 在下面的例子中考虑情况2 ,其中F和T绑定到相同types的IdentityMapper 。 当我们知道的时候,如果我们知道参数typesT (在我的情况下,我们知道的话),我们知道typesF 现在的问题是,我怎样才能实现Java 8 lambdas类似的东西呢? 由于它们实际上不是generics超级界面的常规子类,因此上述方法不起作用。 具体来说,我可以找出parseLambda将java.lang.Integer绑定到T , identityLambda parseLambda绑定到F和T ? PS:理论上讲,应该可以反编译lambda代码,然后使用embedded式编译器(如JDT)并进入其types推断。 我希望有一个更简单的方法来做到这一点;-) /** * The superinterface. */ public interface MapFunction<F, T> { T map(F value); } /** * Case 1: A non-generic subclass. */ public class MyMapper implements […]