Skip to content
googlePublic

About

A small Java 8 library (string manipulation, BiStream, Structured Concurrency, SQL Templates)

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

539 stars

Watchers

10 watching

Forks

Latest commit

 

History

9,502 Commits

Folders and files

Disclaimer: This is not an official Google product.

Mug (Coverage)

A small Java 8+ string processing and streams library (javadoc), battle tested in Google's internal codebase, with 0 deps (Proto, BigQuery, Guava addons are in separate artifacts).

Strings

  • ✅ Substring – simple and composable substring extraction & manipulation
    → Substring.between("(", ")").from("call(foo)") → "foo"
  • ✅ StringFormat – compile-time-safe bidirectional parsing/formatting
    → new StringFormat("/home/{user}/{date}").parse(filePath, (user, date) -> ...)
  • ✅ Parser – everyday string parsing easier, faster and beyond regex
    sequence(word().followedBy("="), digits(), Map::entry)
        .zeroOrMoreDelimitedBy(",")
        .between("{", "}")         // {k1=100, k2=200, k3=300, ...}
        .parseSkipping(Character::isWhitespace, input);
  • DateTimeFormats – define datetime formats by examples
    → DateTimeFormatter format = formatOf("2024-03-14 11.00:00.123 America/New_York")

Streams

  • ✅ BiStream – streams Map and pair-wise collections
    → BiStream.zip(keys, values).toMap()
  • ✅ MoreStreams – extra stream utilities
    Stream<List<Double>> greenDays = MoreStreams.groupConsecutive(
        stockPrices, (p1, p2) -> p1 <= p2, toUnmodifiableList());

Compile-Time Guardrails

  • ✅ @ParametersMustMatchByNamerecord Profile(String userId, String userName) {}
    • new Profile(user.id(), user.name()) Compiles ✅
    • new Profile(user.name(), user.id()) Does Not Compile ❌
  • ✅ SafeSql – compile-time-enforced safe, composable SQL template
    → SafeSql.of("select id, `{col}` from Users where id = {id}", col, id)
More tools
  • Iteration - implement lazy stream with recursive code
  • BinarySearch - solve LeetCode binary search problems
    → BinarySearch.inSortedArrayWithTolerance(doubleArray, 0.0001).find(target)
  • StructuredConcurrency - simple structured concurrency on virtual threads
    → concurrently(() -> fetchArm(), () -> fetchLeg(), (arm, leg) -> makeRobot(arm, leg))
  • Optionals
    → return optionally(obj.hasFoo(), obj::getFoo);
Installation
Maven

Add the following to pom.xml:

  <dependency>
    <groupId>com.google.mug</groupId>
    <artifactId>mug</artifactId>
    <version>11.2</version>
  </dependency>

Add mug-errorprone to your annotationProcessorPaths:

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <annotationProcessorPaths>
              <path>
                <groupId>com.google.errorprone</groupId>
                <artifactId>error_prone_core</artifactId>
                <version>2.23.0</version>
              </path>
              <path>
                <groupId>com.google.mug</groupId>
                <artifactId>mug-errorprone</artifactId>
                <version>11.2</version>
              </path>
            </annotationProcessorPaths>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

SafeSql (javadoc):

  <dependency>
    <groupId>com.google.mug</groupId>
    <artifactId>mug-safesql</artifactId>
    <version>11.2</version>
  </dependency>

Dot Parse Combinators (javadoc):

  <dependency>
    <groupId>com.google.mug</groupId>
    <artifactId>dot-parse</artifactId>
    <version>11.2</version>
  </dependency>

Protobuf utils (javadoc):

  <dependency>
    <groupId>com.google.mug</groupId>
    <artifactId>mug-protobuf</artifactId>
    <version>11.2</version>
  </dependency>
Gradle

Add to build.gradle:

  implementation 'com.google.mug:mug:11.2'
  implementation 'com.google.mug:mug-safesql:11.2'
  implementation 'com.google.mug:dot-parse:11.2'
  implementation 'com.google.mug:mug-guava:11.2'
  implementation 'com.google.mug:mug-protobuf:11.2'

About

A small Java 8 library (string manipulation, BiStream, Structured Concurrency, SQL Templates)

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

539 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages