Can't make simple Streams over indirect projects work

Ben Evans benjamin.john.evans at gmail.com
Sun Jul 28 13:14:47 UTC 2019


Hi,

I'm probably missing something really obvious, but I've been playing
with this code for several days and can't find my bug.

Given an inline class defined like this:

public inline class OptionalInt {
    private static final OptionalInt EMPTY = OptionalInt.default;

    private boolean isPresent = false;
    private int v = 0;

    public static OptionalInt empty() {
        return EMPTY;
    }

    public static OptionalInt of(int val) {
        OptionalInt self = OptionalInt.default;
        self = __WithField(self.v, val);
        self = __WithField(self.isPresent, true);
        return self;
    }

    public int getAsInt() {
        if (!isPresent)
            throw new NoSuchElementException("No value present");

        return v;
    }

    public boolean isPresent() {
        return isPresent;
    }

    public void ifPresent(IntConsumer consumer) {
        if (isPresent)
            consumer.accept(v);
    }

    public int orElse(int other) {
        return isPresent ? v : other;
    }
}

and some code that attempts to use it like this:

public final class Main4 {
    public static void main(String[] args) {
        List<OptionalInt?> opts = new ArrayList<>();
        for (int i=0; i < 5; i++) {
            opts.add(OptionalInt.of(i));
            opts.add(OptionalInt.empty());
            opts.add(null);
        }

        Integer total = opts.stream()
            .map((OptionalInt? o) -> {
                if (o == null)
                    return 0;

                OptionalInt op = (OptionalInt)o;
                return op.orElse(0);
            })
            .reduce(0, (x, y) -> x + y);

        System.out.println("Total: "+ total);
    }
}

Then javac barfs like this:

bevans$ javac -XDallowWithFieldOperator -XDallowGenericsOverValues
javamag/Main4.java

javamag/Main4.java:15: error: ')' expected
            .map((OptionalInt? o) -> {
                             ^
javamag/Main4.java:15: error: : expected
            .map((OptionalInt? o) -> {
                                ^
javamag/Main4.java:15: error: ';' expected
            .map((OptionalInt? o) -> {
                                 ^
javamag/Main4.java:20: error: illegal start of expression\
            })
             ^
4 errors

Could some kind person put me out of my misery and tell me what I'm
doing wrong here, and what the proper way to express this should be?

Thanks,

Ben


More information about the valhalla-dev mailing list