标签: vavr

为什么这个转换器需要铸造

我需要在java中实现enum到enum转换器的实现:Enum_2> Enum_1我想以通用方式实现它.

所以我定义了一个接口:

interface LabelAware<T extends Enum> {
    String getLabel();

    T getObject();
}
Run Code Online (Sandbox Code Playgroud)

并且Enum_1:

enum Enum_1 {
    A, B;

    String getValue() {
        return "whatever";
    }
}
Run Code Online (Sandbox Code Playgroud)

以及Enum_2实现LabelAware和需要转换为Enum_1:

enum Enum_2 implements LabelAware<Enum_1> {
    C("c", Enum_1.A), D("d", Enum_1.B);

    private final String label;
    private final Enum_1 object;

    Enum_2(String label, Enum_1 object) {
        this.label = label;
        this.object = object;
    }

    public String getLabel() {
        return label;
    }

    public Enum_1 getObject() {
        return object; …
Run Code Online (Sandbox Code Playgroud)

java generics enums vavr

10
推荐指数
2
解决办法
182
查看次数

Vavr 对象的序列化器/反序列化器

您好,我正在尝试将 vavr 添加到我的项目中,现在我正在努力解决 Vavr.List 对象的正确序列化问题。下面是我的控制器:

import io.vavr.collection.List;

 @GetMapping(value = "/xxx")
    public List<EntityDeleted> getFile() {
        return List.of(new EntityDeleted(true),new EntityDeleted(true),new EntityDeleted(true),new EntityDeleted(true));
}
Run Code Online (Sandbox Code Playgroud)

EntityDeleted 是我的自定义对象,List 是 Vavr 集合,如 import 语句所示。我在 Postman 中得到的回应是:

{
    "empty": false,
    "lazy": false,
    "async": false,
    "traversableAgain": true,
    "sequential": true,
    "singleValued": false,
    "distinct": false,
    "ordered": false,
    "orNull": {
        "deleted": true
    },
    "memoized": false
}
Run Code Online (Sandbox Code Playgroud)

我期望我的对象的 JSON 列表。下面是我的配置:

@SpringBootApplication
public class PlomberApplication {

    public static void main(String[] args) {
        SpringApplication.run(PlomberApplication.class, args);
    }

    @Bean
    public ObjectMapper jacksonBuilder() {
        ObjectMapper mapper = …
Run Code Online (Sandbox Code Playgroud)

java jackson spring-boot vavr

9
推荐指数
1
解决办法
2580
查看次数

如何使用optionals实现这个嵌套流?

我有一个方法String作为输入,也应该返回一个String.

以下ASCII艺术介绍了逻辑流程:

Option<A> optA = finder.findA(input);

          optA
           /\
isEmpty() /  \ isDefined()  
         /    \
 "ERR_1"       Option<B> optB = finder.findB(optA.get().bid);
                      / \
           isEmpty() /   \ isDefined()
                    /     \
                "ERR_2"    opt2.get().id
Run Code Online (Sandbox Code Playgroud)

基本上给定input我正在寻找A包裹在一个包裹的对象Option.然后是A现在我正在寻找B- 包裹在一个Option,否则返回ERR_1.然后如果B存在则返回它的id,否则返回ERR_2.

我想知道如何使用选项(或模式匹配可能?)以一种简洁的方式(没有任何ifology)实现它 - 可能是单行.

有人可以建议吗?

可以在这里找到试用的源代码.

java functional-programming optional java-8 vavr

8
推荐指数
1
解决办法
587
查看次数

Javaslang对象分解无法正常工作

我使用Javaslang-2.1.0-alpha和它的Javaslang-match相当于进行一些对象分解.根据丹尼尔在"匹配奇特的方式"部分的博客文章:

Match(person).of( Case(Person("Carl", Address($(), $())), (street, number) -> ...) )
Run Code Online (Sandbox Code Playgroud)

如果检索匹配两个通配符模式中值Addressstreetnumber,但例子甚至不编译.我后来意识到所有物体都必须包裹在原子模式中,即"卡尔"变成$("卡尔").这是在阅读了这个问题之后.

我按照更新的教程,但没有更新此示例.

我将示例更新为:

Person person = new Person("Carl", new Address("Milkyway", 42));

 String result2 = Match(person).of(
 Case(Person($("Carl"), Address($(),$())),
         (street, number) -> "Carl lives in " + street + " " + number),
 Case($(), () -> "not found")
 );
 System.out.println(result2);
Run Code Online (Sandbox Code Playgroud)

从控制台输出判断,它编译但我的值没有正确匹配:

Carl lives in Carl Address [street=Milkyway, number=42]
Run Code Online (Sandbox Code Playgroud)

很明显,street包含卡尔number整个Address物体.

当我尝试添加第三个lambda参数来捕获Carl时: …

java lambda java-8 vavr

6
推荐指数
1
解决办法
319
查看次数

使用每种类型的计数将数组转换为Javaslang Map

我目前正在查看Javaslang库,我正在尝试将一些代码转换为Javaslang.

我目前有一些纯Java代码

Cell[][] maze; //from input
Map<Cell, Long> cellCounts = Stream.of(maze)
            .flatMap(Stream::of)
            .collect(groupingBy(c -> c, counting()));
Run Code Online (Sandbox Code Playgroud)

我正在考虑将其转换为Javaslang,因为我对图书馆感兴趣而且我只想玩它.

我试图做类似的事情,但转换为Javaslang地图而不是java.util.Map.

到目前为止我已经尝试了这个,但后来我陷入困境,因为我无法看到转换它的方法.

Array.of(maze)
     .flatMap(Array::of)
Run Code Online (Sandbox Code Playgroud)

所以我有我的Cell对象列表,但我想弄清楚如何将其转换为javaslang.collection.Map

*编辑*

我已经看过将原始java.util.Map变为javaslang.collections.Hashmap

HashMap<Cell, Long> cellsCount = HashMap.ofEntries(cellCounts
                                                        .entrySet()
                                                        .toArray(new Map.Entry[0]));
Run Code Online (Sandbox Code Playgroud)

这仍然不符合Javaslang,但我会继续寻找.

java java-8 vavr

6
推荐指数
1
解决办法
850
查看次数

对不可变队列有什么需求?

我已经使用Java几年了.最近遇到了Vavr,一个Java的函数库,它提供了不可变的集合API.我很想知道拥有不可变队列的原因.

我的理解是,Queue用于在一端为其生成数据,然后另一个线程从另一端消耗数据.

不可变队列不允许你在构造之后添加数据,那么为什么我会在这里使用队列.

理想情况下,我会按如下方式处理队列,但对于不可变的队列,这将进入无限循环.

while(!queue.isEmpty()) {
    queue.dequeue(); // process elements in queue.
}
Run Code Online (Sandbox Code Playgroud)

当我用Google搜索时,所有的讨论都围绕着如何实现不可变队列,但并没有解释它的必要性.

java queue immutability vavr

6
推荐指数
1
解决办法
2401
查看次数

如何使用 Vavr(以前称为 Javaslang)库捕获特定的运行时异常?

我试图捕获特定的运行时异常(因此不可抛出)并记录它(log.error 具有 void 返回类型)。在 vavr 中执行此操作的最简单方法是什么?

try {
    sayHello();
} catch (MyAppRuntimeException ex) {
    log.error("Error occured") // log.error returns void not Void so I couldn't find a suitable method in  Vavr library
}
Run Code Online (Sandbox Code Playgroud)

我努力了

Try.run(() -> sayHello())
   .recover(MyAppRuntimeException.class, ex->log.error("Error occured: {}", ex.getMessage()))
Run Code Online (Sandbox Code Playgroud)

我得到:

错误的返回类型 void 无法转换为 Void

如果 .recover 不是正确的方法,请建议我可以捕获一个特定异常但不能捕获 Throwable 的替代方法,因为它捕获所有异常和错误。

java vavr

6
推荐指数
1
解决办法
8181
查看次数

如何将Option <Try <Foo >>翻转到Try <Option <Foo >>

我有一个Try<Option<Foo>>.我想flatMap Foo进入a Bar,使用可能失败的操作使用它.如果我Option<Foo>是一个Option.none()(并且Try是成功的)并且在这种情况下没有任何关系,这不是失败.

所以我有这样的代码,它确实有效:

Try<Option<Bar>> myFlatMappingFunc(Option<Foo> fooOpt) {
    return fooOpt.map(foo -> mappingFunc(foo).map(Option::of) /* ew */)
                 .getOrElse(Try.success(Option.none()); // double ew
}

Try<Bar> mappingFunc(Foo foo) throws IOException {
    // do some mapping schtuff
    // Note that I can never return null, and a failure here is a legitimate problem.
    // FWIW it's Jackson's readValue(String, Class<?>)
}
Run Code Online (Sandbox Code Playgroud)

然后我称之为:

fooOptionTry.flatMap(this::myFlatMappingFunc);
Run Code Online (Sandbox Code Playgroud)

这确实有效,但看起来真的很难看.

有没有更好的方式来翻转TryOption左右?


注1:我主动不想在内部调用Option.get()和捕获它,Try因为它在语义上不正确.我想我可以恢复,NoSuchElementException但这似乎更糟糕,代码方面. …

java monads java-8 vavr

6
推荐指数
1
解决办法
325
查看次数

带有泛型的Vavr提供了不兼容的类型

任何人都可以解释为什么这个代码:

interface Lol {
  default Try<Seq<? extends Number>> lol() {
    return Try.of(List::empty);
  }
}

class LolImpl implements Lol {
  @Override
  public Try<Seq<? extends Number>> lol() {
    return Try
      .of(() -> List.of(1, 2, 3))
      //.onFailure(Object::hashCode)
      ;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我取消注释onFailure语句,则无法编译?不知道这里发生了什么.怎么改进呢?

java generics vavr

6
推荐指数
2
解决办法
560
查看次数

在 Vavr 中结合两者?

我有一对夫妇的Vavr 无论是的,我想调用函数与Right每个这些要么价值。例如:

Either<MyError, String> either1 = ..
Either<MyError, String> either2 = ..
Either<MyError, String> either3 = ..

Either<MyError, String>> methodRequiringAllInputs(String, String, String) { 
..
}
Run Code Online (Sandbox Code Playgroud)

我当然可以做这样的事情:

either1.flatMap { value1 ->
    either2.flatMap { value2 ->
        either3.flatMap { value3 ->
            methodRequiringAllInputs(value1, value2, value3);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这是非常丑陋的。在其他语言中,您可以仅使用诸如 do-notation 或推导之类的东西来使结构变平。我知道 Vavr 有一个Validation的概念,它是一个应用函子,允许您执行以下操作:

Validation<MyError, String> validation1 = ..
Validation<MyError, String> validation2 = ..
Validation<MyError, String> validation3 = ..

Validation.combine(validation1, validation2, validation3)
          .ap((validationValue1,validationValue2,validationValue3) -> .. );  
Run Code Online (Sandbox Code Playgroud)

这是更好的。

我的问题是,Vavr 中是否存在类似的东西,可以避免嵌套 …

java functional-programming vavr

6
推荐指数
1
解决办法
1275
查看次数