我需要在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) 您好,我正在尝试将 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) 我有一个方法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)实现它 - 可能是单行.
有人可以建议吗?
可以在这里找到试用的源代码.
我使用Javaslang-2.1.0-alpha和它的Javaslang-match相当于进行一些对象分解.根据丹尼尔在"匹配奇特的方式"部分的博客文章:
Match(person).of( Case(Person("Carl", Address($(), $())), (street, number) -> ...) )
Run Code Online (Sandbox Code Playgroud)
如果检索匹配两个通配符模式中值Address
成street
和number
,但例子甚至不编译.我后来意识到所有物体都必须包裹在原子模式中,即"卡尔"变成$("卡尔").这是在阅读了这个问题之后.
我按照更新的教程,但没有更新此示例.
我将示例更新为:
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时: …
我目前正在查看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几年了.最近遇到了Vavr,一个Java的函数库,它提供了不可变的集合API.我很想知道拥有不可变队列的原因.
我的理解是,Queue用于在一端为其生成数据,然后另一个线程从另一端消耗数据.
不可变队列不允许你在构造之后添加数据,那么为什么我会在这里使用队列.
理想情况下,我会按如下方式处理队列,但对于不可变的队列,这将进入无限循环.
while(!queue.isEmpty()) {
queue.dequeue(); // process elements in queue.
}
Run Code Online (Sandbox Code Playgroud)
当我用Google搜索时,所有的讨论都围绕着如何实现不可变队列,但并没有解释它的必要性.
我试图捕获特定的运行时异常(因此不可抛出)并记录它(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 的替代方法,因为它捕获所有异常和错误。
我有一个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)
这确实有效,但看起来真的很难看.
Try
和Option
左右?注1:我主动不想在内部调用Option.get()
和捕获它,Try
因为它在语义上不正确.我想我可以恢复,NoSuchElementException
但这似乎更糟糕,代码方面. …
任何人都可以解释为什么这个代码:
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
语句,则无法编译?不知道这里发生了什么.怎么改进呢?
我有一对夫妇的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 中是否存在类似的东西,可以避免嵌套 …