`

guava 函数式编程三兄弟之Function的用法

阅读更多
先上guavaFunction的接口:
public interface Function<F, T> {
 
  T apply(@Nullable F input);

  boolean equals(@Nullable Object object);
}
该接口提供两个方法,一个是apply,一个是equals.apply方法接受一个input参数返回T。
该接口主要用于转换函数。给我一个输入,我转换为另外需要的输出。
例如:
 public class DateFunction implements Function<String, Date>{

	@Override
	public Date apply(String input) {
		try {
			return new SimpleDateFormat("yyyy-MM-dd").parse(input);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return null;
	}

}
将一个String格式化为一个Date.这样写有什么好处?
这样写可以简化利用匿名内部类的形式简化某些书写,你不需要再建立类了直接可以这样:new Function<String, Date>() {

			@Override
			public Date apply(String input) {
				return null;
			}
		}

Functions封装了一些Function的实现:
比较常用的有:
private static class FunctionForMapNoDefault<K, V> implements Function<K, V>, Serializable {
    final Map<K, V> map;

    FunctionForMapNoDefault(Map<K, V> map) {
      this.map = checkNotNull(map);
    }

    @Override
    public V apply(@Nullable K key) {
      V result = map.get(key);
      checkArgument(result != null || map.containsKey(key), "Key '%s' not present in map", key);
      return result;
    }

    @Override
    public boolean equals(@Nullable Object o) {
      if (o instanceof FunctionForMapNoDefault) {
        FunctionForMapNoDefault<?, ?> that = (FunctionForMapNoDefault<?, ?>) o;
        return map.equals(that.map);
      }
      return false;
    }

    @Override
    public int hashCode() {
      return map.hashCode();
    }

    @Override
    public String toString() {
      return "Functions.forMap(" + map + ")";
    }

    private static final long serialVersionUID = 0;
  }
从map中根据key获取值获取不到就抛出异常。
另外一个比较常用的方法为:
 private static class ForMapWithDefault<K, V> implements Function<K, V>, Serializable {
    final Map<K, ? extends V> map;
    final V defaultValue;

    ForMapWithDefault(Map<K, ? extends V> map, @Nullable V defaultValue) {
      this.map = checkNotNull(map);
      this.defaultValue = defaultValue;
    }

    @Override
    public V apply(@Nullable K key) {
      V result = map.get(key);
      return (result != null || map.containsKey(key)) ? result : defaultValue;
    }

    @Override
    public boolean equals(@Nullable Object o) {
      if (o instanceof ForMapWithDefault) {
        ForMapWithDefault<?, ?> that = (ForMapWithDefault<?, ?>) o;
        return map.equals(that.map) && Objects.equal(defaultValue, that.defaultValue);
      }
      return false;
    }

    @Override
    public int hashCode() {
      return Objects.hashCode(map, defaultValue);
    }

    @Override
    public String toString() {
      // TODO(cpovirk): maybe remove "defaultValue=" to make this look like the method call does
      return "Functions.forMap(" + map + ", defaultValue=" + defaultValue + ")";
    }

    private static final long serialVersionUID = 0;
  }
根据key获取值,假如不存在key就用默认的值代替。
分享到:
评论

相关推荐

    83丨开源实战三(下):借GoogleGuava学习三大编程范式中的函数式编程1

    例如,Guava的`com.google.common.base.Function`接口和`com.google.common.collect.Lists.transform`方法可以让开发者方便地转换和操作列表,实现函数式编程风格的数据处理。 【总结】 函数式编程虽不能完全替代...

    Stream API函数式编程和Guava操作

    Stream API常用操作,初步理解stream操作方法,对java8有初步认知。

    guava-23.0.zip guava.jar guava

    3. **函数式编程**:Guava支持函数式编程,包括Function、Predicate、Transformer等接口,便于编写简洁的代码。 4. **并发处理**:Guava提供了强大的并发工具,如ListenableFuture、CountDownLatch、CyclicBarrier...

    Google Guava 官方教程

    Guava 支持函数式编程风格,包括 Function 接口,可以将一个对象转换为另一个对象,以及 Predicates,用于创建可重用的条件检查。 5. **字符串处理** Guava 提供了有用的字符串工具,如 Joiner 和 Splitter,用于...

    guava-18.0(guava-18.0.jar和guava-18.0-sources.jar)

    3. **函数式编程**:Guava引入了Function、Predicate和Transformer等接口,支持函数式编程风格,便于代码的编写和测试。 4. **缓存机制**:Guava提供了本地缓存实现,可以帮助开发者轻松地在应用程序中构建高效的...

    Guava-并行编程Futures详解.pdf

    《Guava中的并行编程与Futures详解》 在Java并行编程中,Google的Guava库提供了一套强大的工具,极大地丰富了Future接口的功能,尤其是ListenableFuture接口及其相关的扩展。这些工具使得异步计算的管理和处理变得...

    google guava 中文教程

    Guava引入了Function接口,支持函数式编程风格,使得代码更加简洁和模块化。此外,Guava还提供了Predicates(谓词)、Combinators(组合器)和Comparators(比较器)等工具,进一步增强了函数式编程的能力。 六、I/...

    guava-26.0-jre.zip

    3. **函数式编程**:Guava支持函数式编程风格,包括Function、Predicate、Transformer等接口,使得代码更简洁,更易于测试和维护。 4. **并发工具**:Guava提供了丰富的并发工具类,如 ListeningExecutorService、...

    guava-18.0资料

    3. **函数式编程**:Guava引入了Function、Predicate等接口,支持函数式编程风格,便于编写无副作用的代码和进行数据转换。 4. **并发支持**:Guava提供了更高级的并发工具,如RateLimiter(限流器)、Service...

    Guava 工程项目包 有实例

    - **函数式编程**:Guava 引入了 Function 和 Predicate 等接口,促进了函数式编程风格在 Java 中的应用。 - **并发**:Guava 提供了更高级别的并发工具,如 ListenableFuture、Service 等,简化了异步编程和系统...

    不加密Google Guava视频教程.txt

    ├─Google Guava 第06讲-Guava之函数式接口(非常类似Java8,熟悉的可以不看).wmv ├─Google Guava 第07讲-Guava之StopWatch和JDK之ServiceLoader讲解.wmv ├─Google Guava 第08讲-Guava之Files讲解(废话比较多)...

    guava多个版本jar包

    增加了新的函数式编程工具,如Function和Predicate,以及更丰富的Optional API。在I/O方面,增加了对文件系统操作的简化接口,如Files和Paths。Guava 23还优化了缓存,支持弱键和软引用键,以更好地管理内存资源。...

    guava使用方法教程

    guava 使用方法 教程

    guava 常用API说明

    Guava提供了一些函数式编程的工具,如Function、Predicate、Transformer等接口,它们可以用来编写更简洁、可读性更强的代码。例如,Function接口用于表示一个接受一个参数并返回一个结果的函数。 4. **并发工具** ...

    guava(google的java集合包)

    4. **函数式编程**:Guava引入了函数式编程的概念,如Function、Predicate和Transformer接口,使代码更简洁,易于理解和测试。 5. **字符串处理**:Guava提供了Strings类,包含各种静态方法来处理和格式化字符串,...

    guava14.0.1jar包

    7. **函数式编程**:Guava引入了函数式编程的概念,如Function、Predicate和Supplier接口,使得代码更加简洁,易于测试和维护。 8. **事件监听**:Guava的EventBus是一种发布-订阅事件总线,用于组件之间的松耦合...

    Guava是个风火轮之基础工具(3)Java开发Java经

    总而言之,《Guava是个风火轮之基础工具(3)Java开发Java经》这份资料全面地介绍了Guava在Java开发中的各种应用场景,无论是集合处理、缓存管理、函数式编程,还是并发和安全控制,都为我们提供了强大的工具和实践...

    guava-r09-jarjar.jar

    3. **函数式编程**:Guava提供了Function接口和其他相关类,支持函数式编程风格,可以方便地进行操作转换。 4. **并发工具**:Guava提供了如Lists.newArrayList、Sets.newHashSet等线程安全的构造方法,以及...

    Guava常用类库 v33.0.0.zip

    4. **函数式编程**:Guava引入了函数接口(Function、Predicate等)和Optional类,这使得Java代码可以更接近函数式编程风格,提高代码的可读性和可维护性。 5. **字符串处理**:Guava的Strings类包含一系列静态方法...

    guava代码展示

    3. **函数式编程**:Guava引入了函数接口,如Function、Predicate等,这些接口支持函数式编程风格,使得代码更加简洁、可读性强。例如,可以使用Predicate来创建过滤器,Function进行转换操作。 4. **并发工具**:...

Global site tag (gtag.js) - Google Analytics