?♂️ 个人主页:奇想派
?? 作者简介:奇想派,十年全栈开发经验,团队负责人。喜欢钻研技术,争取成为编程达人 ?️!
?️学海无涯苦作舟,?️编程之路无悔路!
? 如果文章对你有帮助的话,欢迎评论?点赞?收藏?加关注,不胜感激!
? 更多内容,点击链接扫码关注公众号?编程达人
在java中借用javascript大规模使用的functional programming
函数式编程是一种编程的范式(A programming paradigm.)。就像面向过程、面向对象。总的来说,Function is King,函数为王。
函数式编程是一种思维模式。该使用什么样的方式去解决你的问题?就像你不想去破解一个代码块完整性(内聚),那么你可以加入一个切面,去影响该代码块的执行结果。
Do everything in function:以函数方式思考。对于一个业务逻辑,如果以函数的角度思考,那么可以抽离出若干的函数进行处理,而非乱糟糟的零散的代码
规定好Input/Output。一个函数规定好IO,就能去更好地承接上下游业务,更好地区分模块。
下面就是标准的函数式编程
var name = "alan";
function greet(){
name = "jade";
return "Hi,I'm "+name;
}
function sayMyName(name){
return "Hi,I'm "+name;
}
greet();
sayMyName(name);
=> "Hi,I'm alan "
在有了上面的函数式编程的思想,接下来结合jdk的Function语法糖,可以产生很强的实战性代码
下面以一个 赚钱---> 买西红柿 ----> 洗西红柿 ----> 切西红柿----> 煮西红柿 的例子。
完整的例子
public class PipleLineTest {
static class Money{}
static class RawTomato{}
static class CleanTomato{}
static class TomatoSlice{}
static class CookedTomato{}
final static Supplier<Money> makeMoney = ()->{
System.out.println("我要努力赚钱买西红柿!!");
Money money = new Money();
System.out.println("赚到钱了,返回一堆钱");
return money;
};
final static Function<Money,RawTomato> buyRawTomato = (money)-> {
System.out.println("去市场买西红柿!");
final RawTomato rawTomato = new RawTomato();
System.out.println("买好西红柿了,得到了一个有泥的西红柿,需要洗一下,回家!");
return rawTomato;
};
final static Function<RawTomato,CleanTomato> cleanTomato = (rawTomato)-> {
System.out.println("回到家,准备洗西红柿!");
final CleanTomato cleanTomato1 = new CleanTomato();
System.out.println("洗好西红柿了!返回一个干净的西红柿");
return cleanTomato1;
};
final static Function<CleanTomato,TomatoSlice> cutTomato = (cleanTomato)-> {
System.out.println("准备切西红柿!");
final TomatoSlice tomatoSlice = new TomatoSlice();
System.out.println("切好西红柿了!返回西红柿切片");
return tomatoSlice;
};
final static Function<TomatoSlice,CookedTomato> cookTomato = (tomatoSlice)-> {
System.out.println("准备烹饪西红柿!");
final CookedTomato cookedTomato = new CookedTomato();
System.out.println("西红柿了煮好了!返回了一个煮好的西红柿,开饭!");
return cookedTomato;
};
public static void main(String[] args){
final Money money = makeMoney.get();
buyRawTomato
.andThen(cleanTomato)
.andThen(cutTomato)
.andThen(cookTomato)
.apply(money);
}
}
由上面可以看出,【煮西红柿】这个完整的步骤每一个步骤的输入输出都非常明确,维护的时候,就可以清晰看到哪个步骤需要调整/修改了。并且强制你去思考输入输出,会规范你的代码,提高可读性。
使用函数式编程,可以很好地模块化每个步骤的代码。而责任链可以很好地承接我们的业务逻辑,而JDK8的函数式语法糖就赋予这2个思想很好实践的能力。
?博主个人博客网站:奇想派
?文章首发平台:微信公众号【编程达人】
?原创不易!各位小伙伴觉得文章不错的话,可以关注我,进行评论?点赞?收藏?三连走起!谢谢大家!
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur