JEmoji is a lightweight and fast emoji library for Java with a complete list of all emojis from the Unicode consortium.
With many utility methods and type safe direct access to Emojis, JEmoji aims to improve your experience and development when working with Emojis.
While several other emoji libraries for Java exist, most of them are incomplete or outdated. JEmoji, on the other hand, offers a complete list of all emojis from the Unicode Consortium, which can be generated quickly and easily with just one task. This is a major advantage over other libraries that may be no longer maintained or require extensive manual work to update their emoji lists.
In addition, the data is fetched from multiple sources to ensure that information about each emoji is enhanced as much as possible.
- unicode.org for all unicode emojis
- Discord custom script for fetching additional information about emojis for Discord
- Slack custom script for fetching additional information about emojis for Slack
Replace the VERSION
with the latest version shown at the start of the README
implementation("net.fellbaum:jemoji:VERSION")
<dependency>
<groupId>net.fellbaum</groupId>
<artifactId>jemoji</artifactId>
<version>VERSION</version>
</dependency>
//Returns an Emoji instance
Emojis.THUMBS_UP;
Emojis.THUMBS_UP_MEDIUM_SKIN_TONE;
Set<Emoji> emojis=EmojiManager.getAllEmojis();
Optional<Emoji> emoji=EmojiManager.getEmoji("😀");
Optional<Emoji> emoji=EmojiManager.getByAlias("smile");
// or
Optional<Emoji> emoji=EmojiManager.getByAlias(":smile:");
Set<Emoji> emojis=EmojiManager.getAllEmojisByGroup(EmojiGroup.SMILEYS_AND_EMOTION);
Set<Emoji> emojis=EmojiManager.getAllEmojisBySubGroup(EmojiSubGroup.ANIMAL_BIRD);
//Commonly used in emoji pickers
Map<EmojiGroup, Set<Emoji>> a = EmojiManager.getAllEmojisGrouped();//{SMILEYS_AND_EMOTION=["😀","😘"...],...}
Map<EmojiSubGroup, Set<Emoji>> b = EmojiManager.getAllEmojisSubGrouped();//{FACE_SMILING=["😀","😄"...],...}
boolean isEmoji=EmojiManager.isEmoji("😀");
boolean containsEmoji=EmojiManager.containsEmoji("Hello 😀 World");
List<Emoji> emojis=EmojiManager.extractEmojisInOrder("Hello 😀 World 👍"); // [😀, 👍]
List<IndexedEmoji> emojis=EmojiManager.extractEmojisInOrderWithIndex("Hello 😀 World 👍");
emojis.get(0).getCharIndex(); // Prints "6"
emojis.get(0).getCodePointIndex() // Prints "6"
emojis.get(1).getCharIndex() // Prints "15"
emojis.get(1).getCodePointIndex() // Prints "14"
emojis.get(0).getEmoji() // Gets the Emoji object
String text=EmojiManager.removeAllEmojis("Hello 😀 World 👍"); // "Hello World "
String text=EmojiManager.removeEmojis("Hello 😀 World 👍", Emojis.GRINNING_FACE); // "Hello World 👍"
String text=EmojiManager.replaceAllEmojis("Hello 😀 World 👍","<an emoji was here>"); // "Hello <an emoji was here> World <an emoji was here>"
//or more control of the replacement with a Function that provides the emoji and wants a string as return value
String text=EmojiManager.replaceAllEmojis("Hello 😀 World 👍",Emoji::getHtmlDecimalCode); // "Hello 😀 World 👍"
String text=EmojiManager.replaceEmojis("Hello 😀 World 👍","<an emoji was here>", Emojis.GRINNING_FACE); // "Hello <an emoji was here> World 👍"
EmojiLoader.loadAllEmojiDescriptions();
EmojiLoader.loadAllEmojiKeywords();
classDiagram
direction BT
class Emoji {
+ getEmoji() String
+ getUnicode() String
+ getHtmlDecimalCode() String
+ getHtmlHexadecimalCode() String
+ getURLEncoded() String
+ getVariations() List~Emoji~
+ getDiscordAliases() List~String~
+ getGithubAliases() List~String~
+ getSlackAliases() List~String~
+ getAllAliases() List~String~
+ hasFitzpatrickComponent() boolean
+ hasHairStyleComponent() boolean
+ getVersion() double
+ getQualification() Qualification
+ getDescription() String
+ getDescription(EmojiLanguage) String
+ getGroup() EmojiGroup
+ getSubGroup() EmojiSubGroup
+ hasVariationSelectors() boolean
}
On every push on the master branch, a benchmark will be executed and automatically deployed to this projects GitHub pages. These benchmarks are executed on GitHub runners and therefore are not very accurate and can differ a bit since this library measures benchmarks in single digit milliseconds range or even below. They are generally okay to measure large differences if something bad got pushed but are not as reliable as the results of benchmark table below which are always executed on the specified specs.
Benchmark | Mode | Cnt | Score** | Error | Units |
---|---|---|---|---|---|
getByAlias -> :+1: |
avgt | 10 | 59,509 | ± 0,608 | ns/op |
getByAlias -> nope |
avgt | 10 | 72,004 | ± 0,546 | ns/op |
containsEmoji | avgt | 10 | 1,403 | ± 0,004 | ms/op |
extractEmojisInOrder | avgt | 10 | 1,382 | ± 0,013 | ms/op |
extractEmojisInOrderOnlyEmojisLengthDescending | avgt | 10 | 6,013 | ± 0,022 | ms/op |
extractEmojisInOrderOnlyEmojisRandomOrder | avgt | 10 | 6,614 | ± 0,045 | ms/op |
extractEmojisInOrderWithIndex | avgt | 10 | 1,814 | ± 0,002 | ms/op |
removeAllEmojis | avgt | 10 | 2,264 | ± 0,370 | ms/op |
replaceAllEmojis | avgt | 10 | 2,517 | ± 0,020 | ms/op |
replaceAllEmojisFunction | avgt | 10 | 2,502 | ± 0,023 | ms/op |
Click to see the benchmark details
CPU: Intel® Core™ i7-13700K
VM version: JDK 1.8.0_372, OpenJDK 64-Bit Server VM, 25.372-b07
Blackhole mode: full + dont-inline hint (auto-detected, use -Djmh.blackhole.autoDetect=false to disable)
Warmup: 5 iterations, 10 s each
Measurement: 5 iterations, 10 s each
Timeout: 10 min per iteration
Threads: 1 thread, will synchronize iterations
Benchmark mode: Average time, time/op
** Score depends on many factors like text size and emoji count if used as an argument. For this benchmark relatively large files were used. Click Here to see the benchmark code and resources.
The emoji list can be easily generated with the generate
Gradle task. The generated list will be saved in the
public
folder.
To get started with your local development, execute the generateJavaSourceFiles
Gradle task in the group jemoji
.