我需要使用BigDecimal进行大量操作,我发现必须表达
Double a = b - c * d; //natural way
Run Code Online (Sandbox Code Playgroud)
如
BigDecimal a = b.subtract(c.multiply(d))//BigDecimal way
Run Code Online (Sandbox Code Playgroud)
不仅丑陋,而且是我和业务分析师之间的错误和沟通问题的根源.他们完全能够用双打读取代码,但现在他们不能.
当然一个完美的解决方案将是java支持运算符重载,但由于这不会发生,我正在寻找一个eclipse插件甚至是一个外部工具,可以从"自然方式"自动转换为"bigdecimal方式".
我不是试图预处理源代码或动态翻译或任何复杂的事情,我只是想要一些我可以输入文本和获取文本,并在源代码中保持"自然方式"作为注释.
PS:我发现这个令人难以置信的智能黑客,但我不想开始进行字节码操作.也许我可以用它来创建一个Natural2BigDecimal翻译器,但如果有人已经做过这样的工具,我不想重新发明轮子.
我不想切换到Scala/Groovy/JavaScript,我也不能,公司规则禁止在服务器端代码中使用java.
在我生命中的第三次,我努力学习哈斯克尔,此时通过了解你的Haskell ....
当作者解释警卫时,他展示了这个例子:
bmiTell :: (RealFloat a) => a -> String
bmiTell bmi
| bmi <= 18.5 = "You're underweight, you emo, you!"
| bmi <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"
| bmi <= 30.0 = "You're fat! Lose some weight, fatty!"
| otherwise = "You're a whale, congratulations!"
Run Code Online (Sandbox Code Playgroud)
并说
这非常让人联想到命令式语言中的一个很大的if else树,只有这个更好,更易读.虽然大的if else树通常不受欢迎,但有时候问题是以这样一种离散的方式定义的,你无法绕过它们.卫兵是一个非常好的选择.
我可以看到警卫更具可读性,但我不明白为什么语法"好得多"
它更灵活?它更强大?守卫的最大优势是什么?
我的大问题可能是句子
虽然大的if else树通常不受欢迎,但有时候问题是以这样一种离散的方式定义的,你无法绕过它们
任何人都可以举一个例子吗?
免责声明:我对Haskell的无知几乎是完美的.对不起,如果这是非常基本的,但我找不到答案,甚至是这样的问题.我的英语也不是那么好.
据我所知,如果我在一个系统中有一个函数以某种方式与文件系统交互,这个函数必须使用IO monad,并且会有类似的类型 IO ()
在我(仅面向业务)的体验中,系统通常与文件系统交互,用于读取/写入具有业务数据的文件,以及用于记录的文件.
在业务应用程序中,日志记录无处不在.因此,如果我在Haskell中编写一个系统(我不会这么久),几乎每个函数都会使用IO monad.
这是常见做法还是以某种方式记录不需要IO()?或者也许Haskell业务应用程序不记录那么多?
另外,其他类型的I/O怎么样?如果我需要从一个函数访问数据库或Web服务,这个函数也使用IO monad或Haskell也有WS和DB monad?我几乎可以肯定,只有一个IO monad ......从我的角度来看,能够知道这种类型的IO看起来很棒,但我确信我的观点不是客观的衡量标准.用处...
我正在将一些代码移动到java8,尝试(有时强迫自己)使用stream和lambdas,我对它们感到不舒服.
我在类中有一些验证业务对象的方法.每个方法看起来都像
Optional<Fail> validate1(BusinessObject bo)
Run Code Online (Sandbox Code Playgroud)
其中Fail是以某种方式描述错误的枚举,如果没有错误,则该方法返回Optional.empty().我不需要收集所有错误,但返回第一个错误,而不执行以下验证.
我正在做的是
//first convert methods to suppliers
Supplier<Optional<Fail>> validate1= () -> validate1(bo);
Supplier<Optional<Fail>> validate2= () -> validate2(bo);
Supplier<Optional<Fail>> validate3= () -> validate3(bo);
//then some stream magic
return Stream.of(validate1, validate2, validate3)
.map(Supplier::get)
.filter(f -> f.isPresent())
.findFirst()
.orElse(Optional.empty()); //without the orElse, no error would return
// Optional(Optional.empty())
// instead of Optional.empty()
Run Code Online (Sandbox Code Playgroud)
它工作,它完成工作,它不执行不必要的方法,它是清晰的(如果Optional.orElse被命名为getOrElse,它会更清晰,但这是我无法实现的).我想要找出的是,如果这是一个合理的方式来做我想要的,如果这个代码被认为是'好风格'或'惯用java8',或者我误用Stream或Optional,或者遗漏了一些明显的东西.
如果它们都是空的,那么返回第一个非空的Optional或者一个空的Optional的想法看起来很普遍,以为有一个正式的方法可以做到这一点,在我脑后的东西是大喊"Monads!",但我的无知Haskell几乎是完美的,所以我不知道.
可以说我有
class Dog extends Animal {}
class Cat extends Animal {}
Run Code Online (Sandbox Code Playgroud)
我有一个动物列表使用Guava FluentIterable我可以一步过滤和转换
List<Cat> cats = FluentIterable.from(animals)
.filter(Cat.class)
.toList();
Run Code Online (Sandbox Code Playgroud)
使用Java8我需要做
List<Cat> cats = animals.stream()
.filter(c -> c instanceof Cat)
.map(c -> (Cat) c)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我无法一步完成过滤器和地图,对吗?
haskell ×2
java ×2
java-8 ×2
bigdecimal ×1
eclipse ×1
io ×1
java-stream ×1
lambda ×1
plugins ×1