首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尝试在Java8中使用Map<类、Function<T、R>>作为instanceOf的替代,无法放入映射

在Java 8中,我们可以使用Map<Class<? extends T>, Function<T, R>>来实现instanceOf的替代。该Map存储了类型Class和对应的Function函数,其中T代表要判断的对象类型,R代表处理该对象类型的返回结果类型。

以下是一种实现方式:

代码语言:txt
复制
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

public class InstanceOfMapper<T, R> {
    private Map<Class<? extends T>, Function<T, R>> typeMap;

    public InstanceOfMapper() {
        typeMap = new HashMap<>();
    }

    public void addMapping(Class<? extends T> clazz, Function<T, R> function) {
        typeMap.put(clazz, function);
    }

    public R apply(T obj) {
        for (Class<?> clazz : typeMap.keySet()) {
            if (clazz.isInstance(obj)) {
                return typeMap.get(clazz).apply(obj);
            }
        }
        // 没有匹配的类型
        return null;
    }
}

使用示例:

代码语言:txt
复制
public class Main {
    public static void main(String[] args) {
        InstanceOfMapper<Number, String> mapper = new InstanceOfMapper<>();

        // 添加类型和对应的处理函数
        mapper.addMapping(Integer.class, num -> "整数:" + num.intValue());
        mapper.addMapping(Double.class, num -> "浮点数:" + num.doubleValue());
        mapper.addMapping(Long.class, num -> "长整数:" + num.longValue());
        mapper.addMapping(Byte.class, num -> "字节:" + num.byteValue());

        // 测试不同类型的对象
        Number num1 = 100;
        Number num2 = 3.14;
        Number num3 = 9999999999L;
        Number num4 = (byte) 8;

        System.out.println(mapper.apply(num1));
        System.out.println(mapper.apply(num2));
        System.out.println(mapper.apply(num3));
        System.out.println(mapper.apply(num4));
    }
}

输出结果:

代码语言:txt
复制
整数:100
浮点数:3.14
长整数:9999999999
字节:8

在这个例子中,我们使用InstanceOfMapper类来替代Java中的instanceOf关键字。我们通过addMapping方法添加了不同类型的Class对象和对应的处理函数,然后通过apply方法来判断对象的类型,并根据类型调用相应的处理函数进行处理。

请注意,该实现方式是基于Java 8的Lambda表达式和函数式接口实现的。如果你需要在Java 7或更低版本中使用,可能需要做一些相应的调整。此外,这只是一个简单的示例,你可以根据实际需求进行扩展和改进。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java8函数式编程

不过事实上,lambda表达式并不是匿名类的语法糖,而且经过一段时间的使用,感觉恰恰相反,在使用上匿名类更像是Java中lambda表达式的载体。...减少不必要的方法创建 在Java中,我们经常会遇到这样一种场景,某个方法只会在某处使用且内部逻辑也很简单,在Java8之前我们通常都会创建一个方法,但是事实上我们经常会发现这样写着写着,一个类中的方法可能会变得非常庞杂...就是对FunctionT,R>的封装。...这个概念可能比较难理解,那举个例子,我们需要将[“hello”, “world”]转换成[h,e,l,l,o,w,o,r,l,d],可以尝试一下使用map,那你会惊讶地发现,可能结果不是你想象中的那样。...此处以最典型的map作为例子,可以看看map的源码 public Optional map(FunctionT, ?

64220

Java Lambda 解析和使用技巧

在 java 中,我更加愿意认为 lambda 实际上是是包着一个函数的对象,我们在使用 lambda 表达式的时候,实际上定义了一个闭包的函数对象,这是 lambda 最大的意义所在。...performed on an object | 输入 T,返回 void FunctionT,R> – a function transforming a T to a R | 输入 T 返回 R...而匿名内部类或者是内部类在使用中则要注意 this 的指向问题。...extends V> function) 作用是对Map中的每个映射执行function指定的操作,并用function的执行结果替换原来的value,其中BiFunction是一个函数接口,里面有一个待实现方法...不存在才加,存在直接跳过 Function是一个函数接口,里面有一个待实现方法R apply(T t). computeIfAbsent()常用来对Map的某个key值建立初始化映射.比如我们要实现一个多值映射

1K10
  • Map在Java 8中增加非常实用哪些函数接口?

    方法签名为V putIfAbsent(K key, V value),作用是只有在不存在key值的映射或映射值为null时,才将value指定的值放入到Map中,否则不对Map做更改.该方法将条件判断和赋值合二为一...Object value)方法,只有在当前Map中key正好映射到value时才删除该映射,否则什么也不做. replace() 在Java7及以前,要想替换Map中的映射关系可通过put(K key,...extends V> function),作用是对Map中的每个映射执行function指定的操作,并用function的执行结果替换原来的value,其中BiFunction是一个函数接口,里面有一个待实现方法...R apply(T t, U u).不要被如此多的函数接口吓到,因为使用的时候根本不需要知道他们的名字....Function是一个函数接口,里面有一个待实现方法R apply(T t). computeIfAbsent()常用来对Map的某个key值建立初始化映射.比如我们要实现一个多值映射,Map的定义可能是

    2K50

    Lambda表达式你会用吗?

    Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。...首先回顾一下Java集合框架的接口继承结构: ? 上图中绿色标注的接口类,表示在Java8中加入了新的接口方法,当然由于继承关系,他们相应的子类也都会继承这些新方法。下表详细列举了这些方法。...方法签名为V putIfAbsent(K key, V value),作用是只有在不存在key值的映射或映射值为null时,才将value指定的值放入到Map中,否则不对Map做更改.该方法将条件判断和赋值合二为一...R apply(T t, U u).不要被如此多的函数接口吓到,因为使用的时候根本不需要知道他们的名字....Function是一个函数接口,里面有一个待实现方法R apply(T t). computeIfAbsent()常用来对Map的某个key值建立初始化映射.比如我们要实现一个多值映射,Map的定义可能是

    90730

    java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)

    实战读书笔记:数值流、Stream创建与Optional类的使用 java8读书笔记:探究java8流收集数据原理 本文将从Collectos中构建收集器入手,详细介绍java8提供了哪些收集器,重点介绍...方法的实现原理已经在 java8读书笔记:探究java8流收集数据原理中也详细介绍,故本篇不再重点介绍。...代码@2:构建最终的累积器。其实现要点如下: 对流中的元素,使用Function classifier,获取对应的分类键值。...使用mangledFactory创建累积初始值,并调用Map#computeIfAbsent方法,放入的值为:downstreamSupplier.get()。...,主要的Map存储结构为HashMap,java8为ConcurrentMap对应类继承体系提供了对应的分组函数:groupingByConcurrent,其使用方法与groupingBy方法类型,故不重复介绍

    9.4K41

    Java开发之Java8 新特性--流式数据处理学习

    流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现。...filter 在前面的例子中我们已经演示了如何使用filter,其定义为:StreamT> filter(Predicate映射 在SQL中,借助SELECT关键字后面添加需要的字段名称,可以仅输出我们需要的字段数据,而流式处理的映射操作也是实现这一目的,在java8的流式处理中,主要包含两类映射操作:map和flatMap...map 举例说明,假设我们希望筛选出所有专业为计算机科学的学生姓名,那么我们可以在filter筛选的基础之上,通过map将学生实体映射成为学生姓名字符串,具体实现如下: List names...与map类似,flatMap也提供了针对特定类型的映射操作:flatMapToDouble(FunctionT,?

    1.8K20

    用好强大的Stream

    函数式接口 众所周知,Java8提供了很多新的特性,Lambda表达式,函数式接口,Optional,新的日期类api。今天简单聊一下Stream的前世今生。... function) { return function.apply(str); } 当然,为了方便我们的使用,还有很多其他的内置接口,看入参和返回值就能知道接口的作用...int applyAsInt(T value) IntFunction R apply(int value) Stream介绍 在Java8之前,如果我们想对集合进行操作还是比较麻烦的。...很多方法的入参其实就是一个函数式接口 映射 函数名 解释 map 接收一个函数作为参数,该函数被应用到每个元素上,并将其映射成一个新的元素 flatMap 接受一个函数作为参数,将流中的每一个值都转换成另一个流...,然后将所有流连接成一个流 先看这2个方法的定义 R> StreamR> map(Function<?

    54910

    Java8 通关攻略

    这样的接口这么简单,都不值得在程序中定义,所以,JDK8在 java.util.function 中定义了几个标准的函数式接口,供我们使用。...无 T 返回类型为T的对象,包 含方法:T get(); FunctionT,R> T R 对类型为T的对象应用操作,并返回结果。...方法 描述 map(Function f) 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素 mapToDouble(ToDoubleFunction f) 接收一个函数作为参数...所有使用该接口的实体类为了适配新的接口约定都需要进行修改(要是这么不兼容的话,迟早被淘汰)。所以,Java8为了解决这一问题引入了一种新的机制。Java8中的接口支持在声明方法的同时提供实现。...我们应该尽量使用这个新方法,而不是老的size方法,size方法返回的类型为int。这是因为映射的数量可能是int无法表示的。

    1.2K31

    Java8 Lambda(一)-函数式接口

    实习前只是粗略的看了下Java8的一些基本语法,但是没有系统的学习过.在使用一段时间后决定系统的对其进行一次分析,加深对Java8函数式编程的理解,提高自己的编码技巧.另外kotlin崛起,感兴趣的朋友尝试下混编也未尝不可...,如果有两个则无法推断.Java8提供了很多函数式接口,一般都使用注解@FunctionalInterface声明,有必要了解如下一些函数式接口....extends R> mapper); map操作接收的是Function接口,对于Function接收T值返回R值,那map的作用就很明显是转换用的,比如下面代码,转换名称为对应的名称长度,也就是从输入...extends R>> mapper); flatMap和map都是使用Function接口,不同的是返回值flatMap限定为Stream类型.所以flatMap可以作为合并流使用,如以下代码,提取出所有的字符...super T> action); peek参数为Consumer,Consumer接收T值,无返回,那么该方法就可以作为调试不影响stream中内容的一些操作,不过由于对象都是地址引用,你再此做一些对象内容操作也是可以的

    1.6K30

    浅谈lambda表达式

    Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中。想想看,在Java8 之前我们想要将行为传入函数,仅有的选择就是匿名内部类。...Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。...尤其是对于做数据的同学来说,当习惯使用类似scala之类的函数式编程语言以后,体会将更加深刻。现在我们就来看看Java8中lambda表达式的一些常见写法。...在我们的例子中,就是通过map方法将cost增加了0,05倍的大小然后输出。...相信用map+reduce+lambda表达式的写法高出不止一个level。 4、filter操作 filter也是我们经常使用的一个操作。在操作集合的时候,经常需要从原始的集合中过滤掉一部分元素。

    49610

    通俗易懂的讲解 lambda 表达式

    Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中。想想看,在Java8 之前我们想要将行为传入函数,仅有的选择就是匿名内部类。...Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。...在我们的例子中,就是通过map方法将cost增加了0,05倍的大小然后输出。...相信用map+reduce+lambda表达式的写法高出不止一个level。 4、filter操作 filter也是我们经常使用的一个操作。在操作集合的时候,经常需要从原始的集合中过滤掉一部分元素。...5、与函数式接口Predicate配合 除了在语言层面支持函数式编程风格,Java 8也添加了一个包,叫做 java.util.function。它包含了很多类,用来支持Java的函数式编程。

    55120

    深度探秘 Java 8 函数式编程(上)

    来源:http://t.cn/ELmra8O 引子 将行为作为数据传递 Java8函数框架解读 函数接口 聚合器 流 ---- 引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和、最大值、...Java8函数框架解读 函数编程的最直接的表现,莫过于将函数作为数据自由传递,结合泛型推导能力,使代码表达能力获得飞一般的提升。那么,Java8是怎么支持函数编程的呢?...mergeFunction用来对两个map中相同key的值进行运算得到新的value值,如果value值为null,会移除相应的key,否则使用value值作为对应key的值。...元素流) ,定义在类 StreamShape 中,主要将操作适配于类型系统。...Spliterator的具体实现类定义在 Spliterators 的静态类和静态方法中。

    77320

    Java8新特性的理解与应用

    String getValue(String str); b.声明一个类TestLambda_3,类中编写成员方法test_2,使用a中定义的接口作为该方法的参数,将一个字符串"lambda"转换为大写...,其中泛型类型为T,R>且T为参数,R为返回值,同时在该接口中声明对应的抽象方法;b.在类TestLambda_3中声明一个成员方法calculate()并使用a中的接口作为参数,输出员工信息。...并且可以使用@FunctionnalInterface注解修饰,以此来判断该接口是否是函数式接口。在Java8以后,函数式接口中允许存在普通方法(即非抽象方法),使用default进行修饰。...2.2内置4大核心函数式接口Cosumer消费型接口;//抽象方法 void accept(T t);SupploerT> 供给型接口;//抽象方法 T get();FunctionT> 函数型接口...3.1基本概念Stream API是java8中处理集合的关键抽象概念,它可以对指定的集合进行操作,如执行非常复杂的查找、过滤和映射数据等操作;使用Stream API对集合数据进行操作,类似于使用SQL

    83030

    关于 Java Lambda 表达式看这一篇就够了(强烈建议收藏)

    方法签名为V putIfAbsent(K key, V value),作用是只有在不存在key值的映射或映射值为null时,才将value指定的值放入到Map中,否则不对Map做更改.该方法将条件判断和赋值合二为一...,使用起来更加方便. remove() 我们都知道Map中有一个remove(Object key)方法,来根据指定key值删除Map中的映射关系;Java8新增了remove(Object key,...Object value)方法,只有在当前Map中**key正好映射到value时**才删除该映射,否则什么也不做. replace() 在Java7及以前,要想替换Map中的映射关系可通过put(K...Function是一个函数接口,里面有一个待实现方法R apply(T t). computeIfAbsent()常用来对Map的某个key值建立初始化映射.比如我们要实现一个多值映射,Map的定义可能是...map() 函数原型为R> StreamR> map(FunctionT,?

    2.9K33

    探究Java8的Stream(二)

    “ 在上一篇的文章中,我们聊到Stream创建的四种方式,以及中间操作筛选与切片,那么今天我们来看一下映射和排序” 01 — 映射流 在探究Java8的Stream(一)中我们说到了映射API,稍微再提一下...: 1.map(Function f) 接收一个函数作为参数,该函数会被应用到每个元 素上,并将其映射成一个新的元素 2.mapToDouble(ToDoubleFunction f) 接收一个函数作为参数...将流中的id通过map弄到一个新的流中,然后输出流出来,这里从map的方法中我们可以看出来,它接受一个函数作为参数,然后对其中每个元素进行映射,进而返回了一个新的流,这个流就叫做映射流(R指定新流的元素类型...,T指定调用流的元素类型,mapper是完成映射的Function实例,被称为映射函数)。...R> StreamR> map(FunctionT, ?

    55820

    面试 | Java8 HashMap原理

    概述 在官方文档中是这样描述HashMap的: Hash table based implementation of the Map interface....类的构造函数 在HashMap的构造函数中并没有对数组Node[] table初始化,而是简单的设置参数,在首次put时调用resize()分配内存 //制定初始容量和填充因子 public...通过tableSizeFor(),保证了HashMap容量始终是2的次方,在通过hash寻找index时就可以用逻辑运算来替代取余,即hash%n用hash&(n -1)替代 4. hash实现 static...大意是,如果直接使用key的hashcode()作为hash很容易发生碰撞。比如,在n - 1为15(0x1111)时,散列值真正生效的只是低4位。...中保存的初始容量分配内存,没有就使用缺省值 + 当超过限制时,就扩充两倍,因为我们使用的是2次幂的扩展,所以,元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置 如oldCap为16时,如图

    60230

    马上Java14要来了,你还不知道Java8的新特性?

    ,它是Java8这个版本最重要的新特性.Lambda允许把函数作为一个方法的参数, 可以使代码变得更加简洁....Function类型接口 @FunctionalInterface public interface FunctionT, R> { // 接收一个参数T,返回一个结果R R apply...所以不接受任何参数,返回T类型结果。 3、方法的引用 方法引用使得开发者可以将已经存在的方法作为变量来传递使用。方法引用可以和Lambda表达式配合使用。...:需要进行转换的集合 FunctionT,R>:函数接口,接收T类型,返回R类型。...System.out::println 其实是 指定对象System.out的非静态方法println的引用 如果构造函数有多个,可能无法区分导致传递失败 4、接口的默认方法和静态方法 Java8使用两个新概念扩展了接口的含义

    70520
    领券