groovy 的inject()方法使用简例
2018-01-11 13:29
281 查看
inject()方法有强大的累计功能,以闭包作为参数处理一个数据结构并返回一个值。inject()方法的第一个参数是第二个参数(闭包)的立即返回值,无需引入额外的变量就能实现累积计算,例如统计图书馆所有丛书库存,每套丛书有不同套数,每套丛书有不同册数和库存数量,业务模型如下
最后,你能想象,如果用java写when部分的代码吗?可能需要写多重循环,还要临时变量保存累积库存,何必如此麻烦,groovy一行代码搞定(因篇幅限制,我折行处理)。groovy简洁的语法,高度描述性,构建对象也非常简单直观,非常适合写测试。groovy更多实用方法,后续持续coding。
欢迎交流,请加公众号:
public class Library { private List<BookSeries> bookSeriesList; // getter and setter } public class BookSeries { private int suitNum; private List<Book> books; // getter and setter } public class Book { private String name; private int store; private double price; // getter and setter }因了inject()的强大累积计算功能,我写了如下测试:
class BookSeriesTest extends Specification { def "验证丛书总数计算正确"() { given: "图书馆丛书列表" def library = new Library( bookSeriesList: [ new BookSeries(suitNum: 1, books: [ new Book(name: "水浒传(上)", store: 1, price: 100.00), new Book(name: "水浒传(中)", store: 2, price: 120.00), new Book(name: "水浒传(下)", store: 3, price: 150.00), ]), new BookSeries(suitNum: 2, books: [ new Book(name: "三国演义(上)", store: 4, price: 100.00), new Book(name: "三国演义(中)", store: 5, price: 120.00), new Book(name: "三国演义(下)", store: 6, price: 150.00), ]), new BookSeries(suitNum: 3, books: [ new Book(name: "西游记(上)", store: 7, price: 100.00), new Book(name: "西游记(中)", store: 8, price: 120.00), new Book(name: "西游记(下)", store: 9, price: 150.00), ]), new BookSeries(suitNum: 4, books: [ new Book(name: "红楼梦(上)", store: 10, price: 100.00), new Book(name: "红楼梦(中)", store: 11, price: 120.00), new Book(name: "红楼梦(下)", store: 4000 12, price: 150.00), ]), new BookSeries(suitNum: 0, books: [ new Book(name: "大秦帝国(上)", store: 10, price: 100.00), new Book(name: "大秦帝国(中)", store: 10, price: 120.00), new Book(name: "大秦帝国(下)", store: 10, price: 150.00), ]), ] ) when:"统计图书馆丛书总库存" def totalStore = library.bookSeriesList.inject(0) { libraryTotalStore, bookSeries -> libraryTotalStore + (bookSeries.suitNum > 0 ? bookSeries.books.store.sum() * bookSeries.suitNum : 0) } then:"验证库存统计正确" totalStore == (1 + 2 + 3) * 1 + (4 + 5 + 6) * 2 + (7 + 8 + 9) * 3 + (10 + 11 + 12) * 4 println totalStore }
最后,你能想象,如果用java写when部分的代码吗?可能需要写多重循环,还要临时变量保存累积库存,何必如此麻烦,groovy一行代码搞定(因篇幅限制,我折行处理)。groovy简洁的语法,高度描述性,构建对象也非常简单直观,非常适合写测试。groovy更多实用方法,后续持续coding。
欢迎交流,请加公众号:
相关文章推荐
- 【Groovy】List对象的transpose和inject方法的使用
- Groovy探索 使用集合方法,写出更加Groovy风格的代码
- Groovy高效编程——‘匕首方法’的使用
- android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法]
- Groovy高效编程——‘匕首方法’的使用
- 【SoapUI】在soapui中使用Groovy脚本常用方法
- android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法](转)
- Groovy探索之闭包 七 使用闭包来实现模板方法模式
- Groovy高效编程——‘匕首方法’的使用
- Spring @Autowired @Resource @Inject 注解使用方法及区别总结
- 12.1Groovy使用GroovyInterceptable拦截方法
- mce-inject使用方法
- [Groovy] List里的Inject方法
- Groovy高效编程——‘匕首方法’的使用
- Groovy高效编程——‘匕首方法’的使用
- Groovy高效编程——‘匕首方法’的使用
- Groovy高效编程——‘匕首方法’的使用
- Groovy探索 使用集合方法,写出更加Groovy风格的代码
- 122.xUtils使用inject取代findViewById的方法填充布局
- Groovy高效编程——‘匕首方法’的使用(更新于2007.09.14)(转载)